簡體   English   中英

在linq中不同?

[英]Distinct in linq?

我想知道如何實現這一目標?

我只想從對象集合中獲得唯一的名稱

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());

但是,我需要在屬性級別而不是對象級別進行區分。 所以我想返回“一個”和“兩個”。 現在,我得到“一個”,“一個”和“兩個”。

我看到了一個名為morelinq的庫,但是我不確定是否應該仍在beta中使用它,並且似乎不再開發它了。

再加上一個提取查詢的整個庫,我不確定是否值得。

也許這樣的事情可以幫助?

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不同運算符不使用默認的相等比較器。

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#編程指南)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM