25

次の定義を持つクラスがあるとします。

public class MyTestClass
{
    public int ValueA { get; set; }
    public int ValueB { get; set; }
}

MyTestClass []配列で重複する値を見つけるにはどうすればよいですか?

例えば、

MyTestClass[] items = new MyTestClass[3];
items[0] = new MyTestClass { ValueA = 1, ValueB = 1 };
items[1] = new MyTestClass { ValueA = 0, ValueB = 1 };
items[2] = new MyTestClass { ValueA = 1, ValueB = 1 };

ValueAとValueBの両方が1である2つのMyTestClassオブジェクトがあるため、重複が含まれています

4

3 に答える 3

55

ValueAとValueBで要素をグループ化することにより、重複を見つけることができます。後でそれらを数えると、どれが重複しているかがわかります。

これは、重複を分離する方法です:

var duplicates = items.GroupBy(i => new {i.ValueA, i.ValueB})
  .Where(g => g.Count() > 1)
  .Select(g => g.Key);
于 2011-04-08T14:34:53.903 に答える
5

Jon SkeetDistinctByExcept一緒に使用して、重複を見つけることができます。の説明については、この応答を参照してくださいDistinctBy

MyTestClass[] items = new MyTestClass[3];
items[0] = new MyTestClass { ValueA = 1, ValueB = 1 };
items[1] = new MyTestClass { ValueA = 0, ValueB = 1 };
items[2] = new MyTestClass { ValueA = 1, ValueB = 1 };

MyTestClass [] distinctItems = items.DistinctBy(p => new {p.ValueA, p.ValueB}).ToArray();
MyTestClass [] duplicates = items.Except(distinctItems).ToArray();

ただし、1つのアイテムのみが返され、両方の重複は返されません。

于 2013-09-06T20:26:00.633 に答える
1

MyTestClassはEqualsメソッドを実装する必要があります。

public bool Equals(MyTestClass x, MyTestClass y)
{
    if (Object.ReferenceEquals(x, y)) return true;

    if (Object.ReferenceEquals(x, null) ||
        Object.ReferenceEquals(y, null))
            return false;

        return x.ValueA == y.ValueA && y.ValueB == y.ValueB;
}

ここにそれについての良い記事があります。

その後、「Distinct」メソッドを使用してMyTestClassの「クリーン」リストを取得できます。

于 2011-04-08T14:38:36.470 に答える