条件拆分列表或数组(或获取子列表等)

时间:2018-07-09 14:51:21

标签: c# arrays performance list linq

从现有列表中创建(条件)子列表/数组的最佳方法是什么?

到目前为止,我的测试只是非常基本的。我想对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

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是示例源代码的链接:

呼叫ToList将根据提供的IEnumerable<TSource>创建一个新列表。 Where + ToListWhere + Add之间没有任何真正的区别-两者基本上都在做相同的事情。

RemoveAll在某些情况下可能会稍快一些,因为它尝试通过删除与子句不匹配的项目,然后释放内部数组的其余部分,来重用源列表。但是,对于其他情况,这可能会更慢。

我怀疑在所有情况下是否都有明显的赢家,而且差异可能微不足道,以至于最好编写最易于阅读和维护的代码,而不用担心这些方法的内部结构。