質問するログイン新規登録

回答編集履歴

7

コード修正

2021/03/30 11:56

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -47,7 +47,7 @@
47
47
  if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
48
48
  return false;
49
49
 
50
- return x.CD== y.CD && x.Name == y.Name;
50
+ return x.CD == y.CD && x.Name == y.Name;
51
51
  }
52
52
 
53
53
  public int GetHashCode(Person person)

6

コード修正&追記

2021/03/30 11:56

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -21,10 +21,51 @@
21
21
  [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の積集合を取得することで下記のように記述できます。エレガントかはわかりません。
22
22
  ```C#
23
23
  var intersect = userPersonList.Intersect(ownerPersonList);
24
- foreach(var user in userPersonList.Intersect(ownerPersonList)){
24
+ foreach(var user in intersect){
25
25
  var owner = ownerPersonList.FirstOrDefault(x => x.CD == user.CD);
26
26
  user.Name = owner?.Name;
27
27
  }
28
28
  ```
29
29
 
30
- IEqutable<TSource> を実装したくない場合は IEqualityComparer<TSource> を使っても実現できます。
30
+ IEqutable<TSource> を実装したくない場合は IEqualityComparer<TSource> を使っても実現できます。
31
+
32
+ ### IEqualityComparer を使う場合
33
+
34
+ ```C#
35
+ public class Person
36
+ {
37
+ public int CD;
38
+ public string Name;
39
+ }
40
+
41
+ public class PersonComparer : IEqualityComparer<Person>
42
+ {
43
+ public bool Equals(Person x, Person y)
44
+ {
45
+ if (Object.ReferenceEquals(x, y)) return true;
46
+
47
+ if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
48
+ return false;
49
+
50
+ return x.CD== y.CD && x.Name == y.Name;
51
+ }
52
+
53
+ public int GetHashCode(Person person)
54
+ {
55
+ if (Object.ReferenceEquals(person, null)) return 0;
56
+
57
+ int hashPersonName = person.Name == null ? 0 : person.Name.GetHashCode();
58
+ int hashPersonCode = person.CD.GetHashCode();
59
+
60
+ return hashPersonName ^ hashPersonCode ;
61
+ }
62
+ }
63
+ ```
64
+
65
+ ```C#
66
+ var intersect = userPersonList.Intersect(ownerPersonList, new PersonComparer());
67
+ foreach(var user in intersect){
68
+ var owner = ownerPersonList.FirstOrDefault(x => x.CD == user.CD);
69
+ user.Name = owner?.Name;
70
+ }
71
+ ```

5

コード修正

2021/03/30 11:55

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -22,7 +22,7 @@
22
22
  ```C#
23
23
  var intersect = userPersonList.Intersect(ownerPersonList);
24
24
  foreach(var user in userPersonList.Intersect(ownerPersonList)){
25
- var owner = ownerPersonList.FirstOrDefault(x => x.CD == person.CD);
25
+ var owner = ownerPersonList.FirstOrDefault(x => x.CD == user.CD);
26
26
  user.Name = owner?.Name;
27
27
  }
28
28
  ```

4

文章の修正

2021/03/30 11:42

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -21,8 +21,9 @@
21
21
  [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の積集合を取得することで下記のように記述できます。エレガントかはわかりません。
22
22
  ```C#
23
23
  var intersect = userPersonList.Intersect(ownerPersonList);
24
- foreach(var person in intersect){
24
+ foreach(var user in userPersonList.Intersect(ownerPersonList)){
25
- person.Name = ownerPersonList.FirstOrDefault(x => x.CD == person.CD)?.Name;
25
+ var owner = ownerPersonList.FirstOrDefault(x => x.CD == person.CD);
26
+ user.Name = owner?.Name;
26
27
  }
27
28
  ```
28
29
 

3

文章の修正

2021/03/30 11:41

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -18,8 +18,7 @@
18
18
  }
19
19
  ```
20
20
 
21
- [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の積集合を取得することで下記のように記述できます。
21
+ [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の積集合を取得することで下記のように記述できます。エレガントかはわかりません。
22
- エレガントかはわかりません。
23
22
  ```C#
24
23
  var intersect = userPersonList.Intersect(ownerPersonList);
25
24
  foreach(var person in intersect){

2

文章の修正

2021/03/30 11:39

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  }
19
19
  ```
20
20
 
21
- [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の積集合を取得して下記のように記述できます。
21
+ [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の積集合を取得することで下記のように記述できます。
22
22
  エレガントかはわかりません。
23
23
  ```C#
24
24
  var intersect = userPersonList.Intersect(ownerPersonList);
@@ -27,4 +27,4 @@
27
27
  }
28
28
  ```
29
29
 
30
- IEqutable を実装したくない場合は IEqualityComparer を使っても実現できます。
30
+ IEqutable<TSource> を実装したくない場合は IEqualityComparer<TSource> を使っても実現できます。

1

積集合だった

2021/03/30 11:39

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -18,11 +18,11 @@
18
18
  }
19
19
  ```
20
20
 
21
- [Enumerable.Union](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.union?view=net-5.0) メソッドで userPersonList の集合を取得して下記のように記述できます。
21
+ [Enumerable.Intersect](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.intersect?view=net-5.0) メソッドで userPersonList の集合を取得して下記のように記述できます。
22
22
  エレガントかはわかりません。
23
23
  ```C#
24
- var union = userPersonList.Union(ownerPersonList);
24
+ var intersect = userPersonList.Intersect(ownerPersonList);
25
- foreach(var person in union){
25
+ foreach(var person in intersect){
26
26
  person.Name = ownerPersonList.FirstOrDefault(x => x.CD == person.CD)?.Name;
27
27
  }
28
28
  ```