LINQ按条件获取分组ID

时间:2013-05-03 07:25:40

标签: linq group-by contains

嗨,我有一个List,所以:

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

我想选择包含至少这3个数字的字母:1,2,3

所以在这种情况下会选择字母A.

你能帮我把它写成LINQ表达式吗?

非常感谢!

2 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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;}
}