5

C# には、キーと値のペアのリストを含むオブジェクト型 'A' があります。

キーと値のペアは、カテゴリ文字列と値文字列です。

オブジェクト タイプ 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);

最終的に、A オブジェクト タイプのリストが作成され、国名のみに基づいて一意の値のみを取得するようにリストを操作したいと考えています。したがって、複数回表示される場合でも、リストを減らして、「国」、「USA」を 1 つだけにする必要があります。

私はlinq Distinctを調べていましたが、パラメーターを定義できず、タイプAの2つの同等のオブジェクトをキャッチできないように見えるため、私が望むことをしません。オーバーライドできることを知っています「Equals」メソッドですが、キーと値のペアの1つに基づいてリストを個別にレンダリングするという私の問題はまだ解決していません。

4

5 に答える 5

2

morelinq を使用するという Karl Anderson の提案を拡張するために、プロジェクトの別の 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;
        }
    }
}

次のように使用します。

collection.DistinctBy(elem => elem.Property);

それをサポートする .NET のバージョンでは、 のHashSet<T>代わりに aを使用できますDictionary<T, Bool>。これは、値が何であるかはあまり気にしないため、既にハッシュされているためです。

于 2013-08-13T18:51:08.770 に答える
1
var result = keyValuePairs.GroupBy(x => x.Key)
                          .SelectMany(g => g.Key == "Country" ?  g.Distinct() : g);
于 2013-08-13T18:22:31.677 に答える
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< string, string>> である場合

于 2013-08-13T18:17:08.143 に答える
1

morelinq プロジェクトDistinctByで構文を確認してください。

A a = new A(keyValuePairs);

a = a.DistinctBy(k => new { k.Key, k.Value }).ToList();
于 2013-08-13T18:17:46.970 に答える