将IEnumerable <t>与IEnumerable <ienumerable <t>&gt;进行比较有效地</IEnumerable的<T> </T>

时间:2012-05-03 08:53:51

标签: c# .net linq lambda

我有一个IEnumerable类集合,以及第二个IEnumerable集合,其中包含一个返回相同的函数。例如:

IEnumerable<MyClass1> list1;
IEnumerable<MyClass2> list2;

MyClass2包含MyClass1的内部集合,其功能如下:

Public MyClass2
{
    private IEnumerable<MyClass1> internalCollection;

    public IEnumerable<MyClass1> ReturnDuplicates(IEnumerable<MyClass1> duplicates
    {                        
        return internalCollection.Where(l => duplicates.Select(d => d.ID).ToString() == l.ID.ToString());
    }
    ...
}

然后我有一个比较两者的功能:

// Function to return a flag indicating if the two lists contain 
// any of the same data
public bool CheckDuplicates(IEnumerable<MyClass1> col1, IEnumerable<MyClass2> col2)
{
    // The following check is wrong as it returns null
    IEnumerable<MyClass1> dupe =                
            col2.Where(w => w.ReturnDuplicates(col1).Count() != 0)
                        as IEnumerable<MyClass1>;

    return (dupe.Count() != 0);
}

CheckDuplicates()中的上述语句返回null。但是,在即时窗口中:

col2.First().ReturnDuplicates(col1).Count()

返回1

我想我知道问题的原因 - 声明正在返回

IEnumerable<MyClass2>

这样的检查是否可以在没有foreach声明的情况下进行?

1 个答案:

答案 0 :(得分:1)

为什么要投标为IEnumerable<MyClass1>?欺骗的类型似乎是IEnumerable<MyClass2>。这就是您的变量为null

的原因

您可以尝试以下代码:

return col2.Any(w => w.ReturnDuplicates(col1).Any())

.Any()避免了.Count()所需的完整枚举。一旦找到匹配,它将立即停止枚举。