2013-05-03 46 views
0

嗨獲取分組ID我有一個列表,以便:LINQ的條件

 
A 1 
A 2 
A 3 
A 4 
B 1 
B 2 
C 1 

我要選擇至少包含這些3個數字字母:1,2,3

所以在這種情況下,將被選中的字母A.

你能幫我寫這個LINQ表達式嗎?

非常感謝!

回答

1

首先,製作所需數字的集合。

var required = new[] { 1, 2, 3 }; 

然後,通過信件分組您的配對。

var groupedPairings = pairings.GroupBy(p => Letter, p => Number); 

然後,丟棄那些沒有你的三個必需項目的配對。 (這裏的邏輯是「取所需物品的集合,該組中刪除任何東西,並確保有一無所有」。)

var groupsWithRequired = groupedPairings 
    .Where(g => !required.Except(g).Any()); 

現在,如果你只是想信,你可以簡單地做

var lettersWithRequired = groupsWithRequired.Select(g => g.Key); 

,或者如果你想從信中來其收藏的數字對應的字典,你可以做

var dictionary = groupsWithRequired.ToDictionary(g => g.Key, g => g.ToArray()); 
var numbersForA = dictionary["A"]; // = {1, 2, 3, 4} 
0

你可以試試這個,雖然我不覺得這是最好的答案:

var items = new List<Item>{ 
    new Item{Name="A", Value=1}, 
    new Item{Name="A", Value=2}, 
    new Item{Name="A", Value=3}, 
    new Item{Name="A", Value=3}, 
    new Item{Name="A", Value=4}, 
    new Item{Name="B", Value=1}, 
    new Item{Name="B", Value=2}, 
    new Item{Name="C", Value=1}, 
}; 

var values = new List<int>{1,2,3}; 

var query = items.GroupBy (i => i.Name) 
       .Where (i => i.Select (x => x.Value) 
           .Intersect(values).Count() == values.Count) 
       .Select (i => i.Key); 

class Item{ 
    public string Name{get;set;} 
    public int Value{get;set;} 
}