从现有列表中创建(条件)子列表/数组的最佳方法是什么?
到目前为止,我的测试只是非常基本的。我想对List和Array的背景逻辑以及是否有更好的(更好性能的)方法有更好的了解。
List<TestClass> list = Enumerable.Range(0, 10_000_000).Select(l => new TestClass()).ToList();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
List<TestClass> list2 = list.Where(l => l.PickMe).ToList(); // 1
stopwatch.Stop();
Debug.WriteLine(stopwatch.ElapsedTicks);
stopwatch.Restart();
List<TestClass> list3 = new List<TestClass>(list.Count);
foreach(TestClass test in list.Where(l => l.PickMe))
{
list3.Add(test); // 2
}
stopwatch.Stop();
Debug.WriteLine(stopwatch.ElapsedTicks);
stopwatch.Restart();
List<TestClass> list4 = new List<TestClass>(list);
list4.RemoveAll(l => !l.PickMe); // 3
stopwatch.Stop();
Debug.WriteLine(stopwatch.ElapsedTicks);
结果:
894168
767723
608211
谢谢!
答案 0 :(得分:1)
以下是示例源代码的链接:
呼叫ToList
将根据提供的IEnumerable<TSource>
创建一个新列表。 Where + ToList
和Where + Add
之间没有任何真正的区别-两者基本上都在做相同的事情。
RemoveAll
在某些情况下可能会稍快一些,因为它尝试通过删除与子句不匹配的项目,然后释放内部数组的其余部分,来重用源列表。但是,对于其他情况,这可能会更慢。
我怀疑在所有情况下是否都有明显的赢家,而且差异可能微不足道,以至于最好编写最易于阅读和维护的代码,而不用担心这些方法的内部结构。