2013-08-13 2 views
5

C#では、キー値のペアのリストを含むオブジェクト型 'A'があります。C#で異なるリストを作成する

キー値のペアは、カテゴリ文字列と値文字列です。オブジェクト・タイプAをインスタンス化する

、私は次の操作を実行する必要があります:

List<KeyValuePair> keyValuePairs = new List<KeyValuePair>(); 
keyValuePairs.Add(new KeyValuePair<"Country", "U.S.A">()); 
keyValuePairs.Add(new KeyValuePair<"Name", "Mo">()); 
keyValuePairs.Add(new KeyValuePair<"Age", "33">()); 

A a = new A(keyValuePairs); 

結局、私は、オブジェクトタイプのリストを持っていますし、私は私が唯一のユニークな値を取得するようにリストを操作したいです私はそれを国名だけに基づいています。したがって、リストが複数回表示されても、「国」、「米国」が1つだけになるようにリストを縮小します。

私はlinq Distinctを探していましたが、パラメータを定義することができず、タイプAの2つの同等のオブジェクトを捕捉できないように見えるので、私が望むことはしません。私は "Equals"メソッドをオーバーライドすることができますが、キー値のペアのうちの1つに基づいてリストを区別することは私の問題を解決しません。

+3

'A'コンストラクタが見えますか? –

+0

代わりにGroupByを使用してください。 –

+0

"Country"は複数ありますが、値が異なる場合は許可されていますか? –

答えて

2

を合計することができクールSTUFにすべての種類のオフ

listOfA.GroupBy(i=>i.Value) 

を行うことができますあなたのプロジェクトのために別のDLLへのリンクにできません(あるいはしたくない)、私はしばらく前にこの自分自身を実装:

次のように使用される
public static IEnumerable<T> DistinctBy<T, U>(this IEnumerable<T> source, Func<T, U>selector) 
{ 
    var contained = new Dictionary<U, bool>(); 
    foreach (var elem in source) 
    { 
     U selected = selector(elem); 
     bool has; 
     if (!contained.TryGetValue(selected, out has)) 
     { 
      contained[selected] = true; 
      yield return elem; 
     } 
    } 
} 

それをサポートする.NETのバージョンでは
collection.DistinctBy(elem => elem.Property); 

私たちは本当に価値が、それはすでにハッシュされていたようなので、多くの何であるか気にしないので、あなたは、代わりにDictionary<T, Bool>HashSet<T>を使用することができます。

1

あなたは最初の明確なプロパティを選択する必要があります。

それは、リスト内のリストなので、あなたはSelectManyを使用することができます。 SelectManyは、副選択の結果を連結します。

List<A> listOfA = new List<A>(); 

listOfA.SelectMany(a => a.KeyValuePairs 
    .Where(keyValue => keyValue.Key == "Country") 
     .Select(keyValue => keyValue.Value)) 
      .Distinct(); 

これはそれです。キーが「国」であるすべての値が選択され、リストが連結されます。最終的にそれは国のものを区別する。クラスAのプロパティKeyValuePairsは少なくともIEnumerableを< KeyValuePair <文字列、文字列であることを考えると>>

1

morelinq projectDistinctBy構文をチェックしてください。

A a = new A(keyValuePairs); 

a = a.DistinctBy(k => new { k.Key, k.Value }).ToList(); 
0

groupby文を使用できます。ここからは、あなたが値をGROUPBYしてからならば、morelinqを使用してのカール・アンダーソンの提案時に展開するには、すべてのキーまたは何か他の便利な

1
var result = keyValuePairs.GroupBy(x => x.Key) 
          .SelectMany(g => g.Key == "Country" ? g.Distinct() : g); 
関連する問題