如何使用LINQ查找列表中其他列表中成员最多的所有项目?

如何使用LINQ查找列表中其他列表中成员最多的所有项目?,linq,Linq,鉴于: 我需要在items中找到所有项s,其中大部分SomeMembers出现在secondList中 在上面的示例中,我希望返回项目0和1,但不返回项目2 我知道我可以使用循环或Contains()之类的方法来实现,但似乎必须有一种更优雅或更高效的方法?这可以很容易地编写: class Item { public int[] SomeMembers { get; set; } } var items = new [] { new Item { SomeMembers = ne

鉴于:

我需要在
items
中找到所有
s,其中大部分
SomeMember
s出现在
secondList

在上面的示例中,我希望返回项目0和1,但不返回项目2


我知道我可以使用循环或
Contains()
之类的方法来实现,但似乎必须有一种更优雅或更高效的方法?

这可以很容易地编写:

class Item {
    public int[] SomeMembers { get; set; }
}

var items = new []
{
    new Item { SomeMembers = new [] { 1, 2 } }, //0
    new Item { SomeMembers = new [] { 1, 2 } }, //1
    new Item { SomeMembers = new [] { 1 } }     //2
}

var secondList = new int[] { 1, 2, 3 };
或者可能(我永远猜不出方法组转换是否有效):

或者把它拔出来:

var result = items.Where(item => item.SomeMembers.Count(x => secondList.Contains(x)) * 2
                                         >= item.SomeMembers.Length);
然后:


你说的“最多”是什么意思?最大值是多少?最频繁的发生?如果你能给出样本数据和预期结果,那会很有帮助。对不起,乔恩,我已经修改了这个问题,加入了你的评论,并进一步澄清了情况。HTH?有点-虽然标题仍然是“大多数成员”而不是“大多数成员”,这是两个截然不同的东西。你是在寻找“大多数成员出现在第二个列表中的列表”?@JerryFederspiel是的。“它的大多数成员出现在第二个列表中的项目”。(你可能讨厌我,但是)我在我的问题中保留了一些复杂性。如果
SomeMembers
实际涉及投影,您的答案会有显著变化吗?特别是一个
选择多个
?如果不清楚,我可以更新问题以反映这一点。我这样问是因为
SomeMembers
被访问了两次。为了解决您关于
HashSet
s的观点,
secondList
将始终<100。@AdamNaylor:在这种情况下,您可能需要将其分离成一个单独的方法。将在中编辑。感谢您的帮助Jon。@JonSkeet将您的查询放入LinqPad,对于第一个,我得到的
运算符“/”不能应用于“method group”和“int”类型的操作数
,对于第二个,
运算符“>=”不能应用于“int”和“method group”类型的操作数。
。。。
var result = items.Where(item => item.SomeMembers.Count(x => secondList.Contains(x)) * 2
                                         >= item.SomeMembers.Length);
Func<int, bool> inSecondList = secondList.Contains;
var result = items.Where(item => item.SomeMembers.Count(inSecondList) * 2
                                         >= item.SomeMembers.Length);
public static bool MajoritySatisfied<T>(this IEnumerable<T> source,
                                        Func<T, bool> condition)
{
    int total = 0, satisfied = 0;
    foreach (T item in source)
    {
        total++;
        if (condition(item))
        {
            satisfied++;
        }
    }
    return satisfied * 2 >= total;
}
var result = items.Where(item => item.MajoritySatisfied(secondList.Contains));