2011-04-09 69 views
6

我想知道我該如何做到這一點?不同於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的庫,但我不確定是否應該使用它,因爲它仍處於測試階段,似乎不再開發。

加一個提取查詢的整個庫我不知道它是否值得。

+0

相關:http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property – Cameron 2011-04-09 21:57:21

回答

14

這種填充文本和值字段:

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

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

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

我怎麼可能把它粘成MyClassToStore – chobo2 2011-04-09 21:52:27

+0

VAR distinctitems = myCollection.GroupBy (x => x.Name).Select(x => x.First())。Select(new MyClassToStore(){Text = x.Name,Value = x.Name})我想,儘管我沒有準確你需要什麼。因爲兩次使用相同的屬性(名稱)有點尷尬......我認爲如果你只需要名字,你應該聽卡梅隆...... – 2011-04-09 22:02:56

6

如果你只是想回不同的名稱,你可以使用:

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

個人而言,我建議你重寫==操作符和!=並確定對象在那裏的唯一性和爲什麼是唯一的。然後在集合上使用Distinct()調用。

您必須小心使用空值,請參閱微軟的Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

+1

要清楚,不要重寫'=='或'!='運算符在任何類型的全局環境中。這裏建議的是重寫你的類從'object'繼承的'Equals'和'=='操作符 – 2014-01-29 17:17:14

2

您可以實現您的類,以便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(); 
} 

}