2011-02-07 17 views
4

私にはList<Location> locationsがあります。リストから重複をフィルタリングする

LocationクラスのプロパティはCoordinatesです。文字列とみなします。

座標が重複する場所を削除して別のリストに配置するにはどうすればよいですか? 2つのリストがあります.1つは重複するものと1つはないものです。

答えて

3

本当に何を意味するかによって異なります。あなたがユニークであるこれらの項目のための1つのリストが必要な場合は、一方

var locationsByCoordinates = locations.ToLookup(location => location.Coordinates); 

var distinct = locationsByCoordinates.Select(group => group.First()) 
            .ToList(); 

var duplicates = locationsByCoordinates.SelectMany(group => group.Skip(1)) 
             .ToList(); 

、および他:あなたは1つの代表リスト、および残りの重複のために別のものをしたい場合は、行うことができます

これは、ルックアップを2回列挙するので、やや効率が悪いです。 >(あなたが選択したプロパティに基づいてオブジェクトを比較することを可能にする)あなたの最初の仕事の一つになるだろう

たIEqualityComparer <ロケーションの作成
var distinct = new List<Location>(); 
var duplicates = new List<Location>(); 

foreach(var group in locationsByCoordinates) 
{ 
    var target = group.Count() == 1 ? distinct : duplicates; 
    target.AddRange(group); 
} 
+1

.ToList()は、コレクションを列挙します。あなたがそれを必要としないなら、それをしないでください。:-) –

+1

@Tuomas Hietanen:実際、OPは* list * -outputを求めます。 – Ani

4

:わずかに良いのようなものになるだろう。

Linqを使用してユニークなアイテムを取得する場合は、Distinct()メソッドを使用できます。

その後、元のリストからアイテムを削除して、重複のコレクションを残しておくことができます。

var distinctObjects = originalList.Distinct(); 
var duplicateList = originalList.Except(distinctObjects); 

あなたは除くために別々のためのカスタム等値比較子を使用する必要がありますが、ないます。

関連する問題