2011-08-24 23 views
2

私は、国のインスタンスで完全に埋め尽くされた国の一般的なリストを持っています。プロパティ値に基づくLINQ個別選択

List <Country> mylist 

このリストは異なる国のインスタンスを持ちますが、一部のプロパティ "name"の値は同じです。

どのように私は異なる名前の国だけを得るために国 "名前"のプロパティを区別することができますか?

ありがとうございました。

Greets。

ホセ。あなたはThrowIfNull拡張メソッドと一緒にあなたのコードの中に、1つの方法を単にコピーすることができ - (あなたはもちろんのMoreLINQのすべてを行う必要はありません

var distinctCountries = allCountries.DistinctBy(c => c.Name); 

+0

あなたはLINQのは右、 'Distinct'を持って知っているのですか? :) – bzlm

+0

@bzlm:それは、カスタム同値比較者を書かずにOPが望んでいることをしません。 –

+0

@jon、何もせず何もしません。 :) – bzlm

答えて

5

JonはMoreLINQを提案しましたが、これは明らかに問題はありませんが、別の依存関係を回避したいことがあります。この場合、あなたはあなた自身のIEqualtyComparer<Country>Enumerable.Distinctを使用することができます。

var distinctCountries = myList.Distinct(new EqualityComparerForCountryByName()); 
//IEqualityComparer 
class EqualityComparerForCountryByName : IEqualityComparer<Country> { 
    public bool Equals(Country x, Country y) { 
     if(Object.ReferenceEquals(x, y)) { return true; } 
     if(x == null || y == null) { return false; } 
     return x.Name == y.Name; 
    } 

    public int GetHashCode(Country obj) { 
     if(obj == null) { return 0; } 
     return obj.Name.GetHashCode(); 
    } 
} 
+0

はい、これは私が探していたものです。このプロジェクトには何も追加できません。有用な情報をありがとう。 – Jose3d

+0

「比較」が必要でした。 – Marc

+0

@Marc:ハッシュコードを計算する能力が必要です( 'Distinct'は、' GetHashCode'を明示的に使ってハッシュテーブルを構築し、衝突を解決するためには 'Equals'が必要です)。 – jason

5

あなたはそのDistinctBy方法でMoreLINQを使用することができます)ライセンステキストを適切に保存してください。

+0

本当にいいですね、残念ですが、私はこのプロジェクトにものを追加することはできません。その閉じたもの。ありがとう。 – Jose3d

+0

@ Jose3d:どのようにして、スタックオーバーフローの答えからのコードを、はっきりとかなりリラックスしたライセンスで何かを取るのとはかなり違うものにしていますか?クローズドソース製品では、ライセンスに応じてオープンソースソフトウェアを使用することができます。アトリビューションの観点からライセンスに留意するだけで済みます。 –

関連する問題