如何通过 linq 或 lambda 获取不同的值?

How to getting distinct values by linq or lambda?

我有一个项目列表,我尝试通过不同的键获取唯一的项目。 class:

class TempClass
    {
        public string One { get; set; }
        public string Two { get; set; }
        public string Key
        {
            get
            {
                return "Key_" + One + "_" + Two;
            }
        }
    }    

我按如下方式构建虚拟列表:

List<TempClass> l = new List<TempClass>()
        {
            new TempClass(){ One="Da" , Two = "Mi"},
            new TempClass(){ One="Da" , Two = "Mi"},
            new TempClass(){ One="Da" , Two = "Mi"},
            new TempClass(){ One="Mi" , Two = "Da"},
            new TempClass(){ One="Mi" , Two = "Da"},
        };

我的问题是 - 如何只获得 1 件物品?通过检查是否只存在唯一键?唯一项意味着应该检查是否只有一个等于 "Key_Da_Mi" 或 "Key_Mi_Da"?

的键

如何实现?

您应该实施相等比较,或者根据您的特定逻辑实施IEqualityComparer<T>

class TempClassEqualityComparer : IEqualityComparer<TempClass>
{
    public bool Equals(TempClass x, TempClass y)
    {
        if (Object.ReferenceEquals(x, y)) return true;

        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        // For comparison check both combinations
        return (x.One == y.One &&  x.Two == y.Two) || (x.One == y.Two && x.Two == y.One);
    }

    public int GetHashCode(TempClass x)
    {
        if (Object.ReferenceEquals(x, null)) return 0;

        return x.One.GetHashCode() ^ x.Two.GetHashCode();
    }
}

然后你可以在Distinct方法中使用这个比较器:

var result = l.Distinct(new TempClassEqualityComparer());

只需在创建密钥之前订购它们。

public string Key
{
  get{
    List<string> l = new List<string>{One, Two};
    l = l.OrderBy(x => x).ToList();
    return "Key_" + string.Join("_", l);
  }
}

将每个项目分组到包含两个键的 HashSet 字符串中,使用 HashSet 的集合比较器将项目作为集合进行比较(集合是无序的),然后从中取出第一个(或任何一个)项目每组:

var distinct = l.GroupBy(item => new HashSet<string>() { item.One, item.Two },
        HashSet<string>.CreateSetComparer())
    .Select(group => group.First());