2010-10-07 77 views
1

我有一个情况,我有一个ID列表{1,2,3,4}。我需要传入一个方法的另一个ID列表,如果列表中有相同的数字,则返回true,否则如果两个列表不相同(不考虑排序),我需要返回false。因此,使用{1,2,3,4,5}的方法调用应该返回false,而使用{2,4,1,3}的调用返回true。这听起来很简单,但我无法弄清楚如何去做。如何创建这个linq查询

回答

0

如果你保证不会有重复的元素idList,您可以使用以下命令:

if (idList.Count == otherIDList.Count && 
    idList.Intersect(otherIDList).Count() == idList.Count) 
{ 
    // Contain same things. 
} 
else 
{ 
    // Do not contain same things. 
} 

第一次检查是确保它们是相同的尺寸。这是一个非常便宜的方法,可以查看这些列表是否有与字符串相同的机会。此外,没有它,如果otherIDListidList的超集,则该语句将返回true。

如果你不能保证集合中的唯一性,我认为你将不得不自己编写代码。

+0

谢谢。我正在考虑相交方法,但我不记得它被称为什么。再次感谢! – 2010-10-08 12:23:00

2

最简单的方法可能是这样的:

var idSet = new HashSet<int>(idList1); 
if (idSet.SetEquals(idList2)) 
{ 
    ... 
} 

按照意见,这会考虑{1,1,1,1,1}等于{1} - 换句话说,它将它视为一个集合,而不是无序的可能重复值集合。

+0

提醒说,LINQ不是一个银色的子弹来处理集合。 – 2010-10-07 20:42:53

+0

我想补充说明,如果列表中有重复元素,这将不起作用。据说他们是问题中的ID,所以可能会认为他们不会重复。但是没有明确说明。 – jdmichal 2010-10-07 20:48:23

+0

@jdmichal:的确如此。将更新提到这一点。 – 2010-10-07 20:51:50