2017-06-28 7 views
1

私は現在、オブジェクトの私のリストの特性の一つに指定した重複する値を持つリストから項目を削除するクリーン、最もパフォーマンスの道を見つけようとしています。のは、私は潜在的にエントリの数千人が含まれているList<MyModel> modelsを持っているとしましょう、今C#の異なるフィールドに基づいてリストからエントリを削除

public class MyModel 
    { 
    public string PropertyA { get; set; } 

    public string PropertyB { get; set; } 

    public string PropertyC { get; set; } 
    } 

:以下の例を参照してください。私は、PropertyBが同じであるもの(最初のもの)以外のすべてのエントリを削除できるようにしたいと思います。

私はこれを行うことを考えてきた唯一の方法は、パフォーマンスにかなり課税のようだと私は別のway-現在の考え方は以下の通りです見つけるしたいと思います:

List<MyModel> models = //initialized externally, contains thousands of records 
List<MyModel> noDuplicatePropertyBs = new List<MyModel>(); 
List<string> propertyBs = new List<string>(); 

foreach(var model in models) 
{ 
    if(!propertyBs.Contains(model.PropertyB)) 
    { 
     noDuplicatePropertyBs.Add(model); 
     propertyBs.Add(model.PropertyB); 
    } 
} 

編集:私は考えていることに注意してください私はMyModelクラスの基本Equalsメソッドをオーバーライドして、PropertyBを.Distinct()メソッドを使って比較することができますが、プロジェクトの他の多くの部分に必要なオーバーライドEqualsメソッドを既に持っています(この目的のequalsメソッドをオーバーライドしません)ビジネスロジックが賢明なので良いアイデアのように思えますが、オブジェクトは3つのプロパティをすべて同じにする必要があります)

+0

あなたはLINQを使用する必要があります。詳細については、ドキュメントをチェックしてください。 –

+0

特に重複した質問に対する回答を確認してください。そのメソッドをコードにドロップするか、またはMoreLinq NuGetを追加するだけで、以下のことができます: 'var noDuplicatePropertyBs = models.DistinctBy(m => m.B);' –

答えて

2

ではなくList<string>propertyBsHashSet<string>を作成し、意思決定を行うためにAddの戻り値を使用します。

var propertyBs = new HashSet<string>(); 
var res = models.Where(m => propertyBs.Add(m.PropertyB)).ToList(); 

あなたはハッシュセットにAddを呼び出すと、最初の項目の追加のみがtrueを返します。すべての重複追加はfalseを返すので、対応するモデルは除外されます。

0

可能な解決策は、機能別にLinqグループを使用しています。 はこの中を見てみましょう:Group by in LINQ

関連する問題