我想知道我怎么才能做到这一点?
我只想从对象集合中得到不同的名称
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。所以我想要回"一"one_answers"二"现在我得到了"一"、"一"one_answers"二"。
我看到一个名为morelinq的库,但我不确定是否应该使用它,因为它仍处于测试阶段,似乎不再被开发。
加上一个整个库的提取查询,我不确定是否值得。
也许这样的东西可以帮助?
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#编程指南)。