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

回答編集履歴

2

追記

2019/04/27 04:58

投稿

hihijiji
hihijiji

スコア4152

answer CHANGED
@@ -63,4 +63,28 @@
63
63
  fruits.AddRange(oranges);
64
64
 
65
65
  var result = fruits.Distinct().ToList();
66
- ```
66
+ ```
67
+ --- 追記 --
68
+ あるいは基底クラス(EquatableFruits)を用いずにIFruitsの比較クラスを用意して
69
+ ``` C#
70
+ class FruitsEqualtyComparer : IEqualityComparer<IFruits>
71
+ {
72
+ public bool Equals(IFruits x, IFruits y)
73
+ {
74
+ return x.Price == y.Price && x.Weight == y.Weight;
75
+ }
76
+
77
+ public int GetHashCode(IFruits obj)
78
+ {
79
+ return obj.Price.GetHashCode() ^ obj.Weight.GetHashCode();
80
+ }
81
+ }
82
+ ```
83
+ ``` C#
84
+ var fruits2 = new List<IFruits>();
85
+ fruits2.AddRange(apples);
86
+ fruits2.AddRange(oranges);
87
+
88
+ var result2 = fruits.Distinct(new FruitsEqualtyComparer()).ToList();
89
+ ```
90
+ のほうが汎用的かもしれません。

1

EquatableFruits の実装ミス修正

2019/04/27 04:58

投稿

hihijiji
hihijiji

スコア4152

answer CHANGED
@@ -6,13 +6,18 @@
6
6
  decimal Price { get; set; }
7
7
  }
8
8
 
9
- class EquatableFruits : IFruits, IEquatable<IFruits>
9
+ class EquatableFruits : IFruits, IEquatable<EquatableFruits>
10
10
  {
11
11
  public decimal Weight { get; set; }
12
12
  public decimal Price { get; set; }
13
13
 
14
- public bool Equals(IFruits other)
14
+ public override int GetHashCode()
15
15
  {
16
+ return Weight.GetHashCode() ^ Price.GetHashCode();
17
+ }
18
+
19
+ public virtual bool Equals(EquatableFruits other)
20
+ {
16
21
  return
17
22
  this.Price == other.Price
18
23
  &&
@@ -34,9 +39,26 @@
34
39
  ``` C#
35
40
  var fruits = new List<EquatableFruits>();
36
41
 
37
- var apples = new List<Apple>(); // 実際には値を入れる
42
+ var apples = new List<Apple>
43
+ {
44
+ new Apple
45
+ {
46
+ Price = 100,
47
+ Weight = 200,
38
- var oranges = new List<Orange>(); // 実際には値を入れる
48
+ WithHoney = true
49
+ }
50
+ };
39
51
 
52
+ var oranges = new List<Orange>
53
+ {
54
+ new Orange
55
+ {
56
+ Price = 100,
57
+ IsNoSeed = true,
58
+ Weight = 200
59
+ }
60
+ };
61
+
40
62
  fruits.AddRange(apples);
41
63
  fruits.AddRange(oranges);
42
64