如何使用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));