在C#中创建一个不同的列表

mo *_*laz 5 c# linq list distinct

在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);
Run Code Online (Sandbox Code Playgroud)

最终,我将有一个A对象类型的列表,我想操纵列表,以便我只获得唯一的值,我只根据国家名称.因此,我希望列表减少到只有一个"国家","美国",即使它出现不止一次.

我正在研究linq Distinct,但它没有做我想要的,因为它我无法定义任何参数,因为它似乎无法捕获两个类型A的等效对象.我知道我可以覆盖"等于"方法,但它仍然无法解决我的问题,即根据一个键值对呈现列表.

KCh*_*oux 2

为了扩展 Karl Anderson 使用 morelinq 的建议,如果您无法(或不想)链接到项目的另一个 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用方法如下:

collection.DistinctBy(elem => elem.Property);
Run Code Online (Sandbox Code Playgroud)

在支持它的 .NET 版本中,您可以使用 aHashSet<T>代替 a Dictionary<T, Bool>,因为我们并不真正关心该值是什么,因为它已经被散列了。