我有一个列表列表,其中包含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);
我到底在做什么错?如何修改此语句以使其按预期工作?
答案 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>