Distinct in linq?

本文关键字:linq in Distinct | 更新日期: 2023-09-27 17:49:30

我想知道我怎么才能做到这一点?

我只想从对象集合中得到不同的名称

MyObject a = new Object();
a.Name = 'One';
a.Value = '10';

MyObject b = new Object();
b.Name = 'One';
b.Value = '15';

MyObject c = new Object();
c.Name = 'Two';
c.Value = '10';

所以我只想要回名字。在这种情况下,我不关心值,只关心名称。

所以我试了

//将所有对象添加到集合中。

myCollection.Disinct()..Select(x => new MyClassToStore() {Text = x.Name, Value = x.Name}).ToList());

但是,我需要在属性级别而不是在对象级别执行distinct。所以我想要回"一"answers"二"现在我得到了"一"、"一"answers"二"。

我看到一个名为morelinq的库,但我不确定是否应该使用它,因为它仍处于测试阶段,似乎不再被开发。

加上一个整个库的提取查询,我不确定是否值得。

Distinct in linq?

也许这样的东西可以帮助?

var distinctItems = items
     .GroupBy(x => x.PropertyToCompare)
     .Select(x => x.First());

这将填充文本和值字段:

   myCollection.Select(x => x.Name).Distinct()
      .Select(x => new MyClassToStore { Text = x, Value = x }).ToList();

如果您只想要不同的名称,您可以使用:

myCollection.Select(x => x.Name).Distinct().ToList();

您可以实现您的类,使linq distinct操作符不使用默认的相等比较器。

class YourClass:IEquatable<YourClass> 
{

…您的实现细节. ...

    public bool Equals(YourClass other)
    {
        if (Object.Equals(this, other))
        {
            return true;
        }
        else
        {
            if(Name == other.Name && Value == other.Value)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
 public override int GetHashCode()
 {
     return Name.GetHashCode() ^ Value.GetHashCode();
 }
}

我个人建议您重写操作符==和!=,并确定对象如何以及为什么在那里是唯一的。然后对集合使用Distinct()调用。

你必须小心null值,参见Microsoft的重载Equals()和Operator ==指南(c#编程指南)。