【发布时间】:2014-10-22 08:41:56
【问题描述】:
我有一个带有IList<T> 参数的方法。它是IList 而不是IEnumerable,因为该方法需要快速随机访问并且根本不会查询大多数条目(算法类似于binary search),而IList 似乎是唯一适合此的.NET 接口.
public static int DoStuff<T>(System.Collections.Generic.IList<T> list)
{
// ...
}
但是现在我有类似以下情况:
System.Tuple<int, int>[] originalList = { /* ... */ };
System.Collections.Generic.IList<int> list = originalList
.Select(x => x.Item1)
.ToList();
所需的值并不直接在列表中,而是列表项的成员。上面的 LINQ 代码解决了这个问题,但有一个警告:整个列表都被复制了!我不希望这样,因为列表可能很大。
如何在不复制的情况下执行此类选择?有没有办法在返回 IList 而不是 IEnumerable 的 IList 上执行 Select?
目前我考虑的解决方案:
- 将选择器传递给
DoStuff,让它即时进行选择。 - 编写一个接受 IList 和选择器的包装器,实现 IList,并在查询项目时进行选择。
我不喜欢 (1),因为选择不是 DoStuff 的工作。现在,(2)将是我的解决方案,但我想知道是否有更好的方法可以做到这一点,甚至可能是我忽略的内置方法。
【问题讨论】:
标签: c# .net linq collections