2011-02-04 71 views
4

我有一個List<T>包含一些用戶定義的類數據。LINQ使用C#問題

我想查找2個數據字段組合的唯一實例。例如,如果條目包含字段「名稱」和「年齡」,則需要名稱和年齡組合的唯一情況,例如,達倫32,只能被檢索一次,即使它在列表中多次。

這可以通過LINQ來實現嗎?

謝謝。

回答

5

你只需要提取這些數據字段,並使其獨特:

var result = list 
    .Select(x => new { Age = a.Age, Name = x.Name}) 
    .Distinct(); 

這將創建包含年齡和名字屬性匿名類型的IEnumerable的。

如果您需要查找唯一數據後面的項目,您需要GroupBy。這將爲列表提供每個組後面的單個項目。

var result = list 
    .GroupBy(x => new { Age = a.Age, Name = x.Name}); 

foreach (var uniqueItem in result) 
{ 
    var age = uniqueItem.Key.Age; 
    var name = uniqueItem.Key.Name; 
    foreach (var item in uniqueItem) 
    { 
     //item is a single item which is part of the group 
    } 
} 
1

看一看的Distinct擴展方法

4
myList.Select(l => new { l.Name, l.Age }) 
     .Distinct() 
     .ToDictionary(x => x.Name, x => x.Age) 
+0

非常感謝,但我怎麼然後存儲兩個值,比如在一本字典?我收到一個錯誤,說不能轉換?再次感謝。 – 2011-02-04 10:58:45

+0

使用ToDictionary方法,在這個問題的更多信息,看看第一個答案:http://stackoverflow.com/questions/627867/linq-query-to-return-a-dictionarystring-string – 2011-02-04 11:06:47

1

簡單:

var people = new List<Person>(); 

// code to populate people 

var uniqueNameAges = 
    (from p in people 
    select new { p.Name, p.Age }).Distinct(); 

然後到詞典:

var dictionary = 
    uniqueNameAges 
    .ToDictionary(x => x.Name, x => x.Age); 

還是要查找(很像Dictionary<string, IEnumerable<int>>在這種情況下):

var lookup = 
    uniqueNameAges 
    .ToLookup(x => x.Name, x => x.Age); 

如果你有人Ë命名爲「約翰」具有鮮明的時代,那麼你可以像這樣訪問他們:

IEnumerable<int> ages = lookup["John"];