Linq从列表中的多个列表中选择值

时间:2018-12-24 12:12:26

标签: c# linq

我有一个列表列表,其中包含IntPtr个变量

var testList = new List<List<IntPtr>>();

我正在尝试使用Linq从列表中选择IntPtr变量,其中列表的大小大于0并且IntPtr不等于IntPtr.Zero

我尝试了以下

var pointers = testList.Where(list => list.Count > 0)
                       .SelectMany(pointer => pointer != IntPtr.Zero);

我到底在做什么错?如何修改此语句以使其按预期工作?

1 个答案:

答案 0 :(得分:3)

当前,您正在将谓词传递给SelectMany,这不是期望的。相反,它期望的是Func<List<IntPtr>, IEnumerable<IntPtr>>,其中List<IntPtr>是输入列表,IEnumerable<IntPtr>是函数调用时返回的值。

SelectMany随后将获取每个嵌套的IEnumerable<IntPtr>并将其折叠为单个IEnumerable<IntPtr>

此外,您还尝试在!=表示的序列(List<IntPtr>)上使用pointer运算符,但该操作无效。

相反,您应该先通过SelectMany 折叠嵌套的序列,然后通过Where子句应用谓词:

var pointers = testList.Where(list => list.Count > 0) // IEnumerable<List<IntPtr>>
                       .SelectMany(list => list) // IEnumerable<IntPtr>
                       .Where(pointer => pointer != IntPtr.Zero); // IEnumerable<IntPtr>

另一方面,您甚至不需要第一个Where子句,因为它可以是:

var pointers = testList.SelectMany(list => list) // IEnumerable<IntPtr>
                       .Where(pointer => pointer != IntPtr.Zero); // IEnumerable<IntPtr>