gpt4 book ai didi

c# - IEnumerable.Count() 或 ToList().Count

转载 作者:太空狗 更新时间:2023-10-29 18:06:36 25 4
gpt4 key购买 nike

我得到了我自己类的对象列表,如下所示:

public class IFFundTypeFilter_ib
{
public string FundKey { get; set; }
public string FundValue { get; set; }
public bool IsDisabled { get; set; }
}

属性(property)IsDisabled通过查询 collection.Where(some condition) 设置并计算匹配对象的数量。结果是 IEnumarable<IFFundTypeFilter_ib>其中不包含属性计数。我想知道,什么会更快。

这个:

collection.Where(somecondition).Count();

或者这个:

collection.Where(someocondition).ToList().Count;

集合可以包含很少的对象,但也可以包含,例如 700。我将进行两次计数调用并使用其他条件。在第一个条件下,我检查 FundKey 是否等于某个键,在第二个条件下,我做同样的事情,但我将它与其他键值进行比较。

最佳答案

你问:

I wonder, what would be faster.

每当你要求你实际计时并找出答案时。

我开始测试所有这些获取计数的变体:

var enumerable = Enumerable.Range(0, 1000000);
var list = enumerable.ToList();

var methods = new Func<int>[]
{
() => list.Count,
() => enumerable.Count(),
() => list.Count(),
() => enumerable.ToList().Count(),
() => list.ToList().Count(),
() => enumerable.Select(x => x).Count(),
() => list.Select(x => x).Count(),
() => enumerable.Select(x => x).ToList().Count(),
() => list.Select(x => x).ToList().Count(),
() => enumerable.Where(x => x % 2 == 0).Count(),
() => list.Where(x => x % 2 == 0).Count(),
() => enumerable.Where(x => x % 2 == 0).ToList().Count(),
() => list.Where(x => x % 2 == 0).ToList().Count(),
};

我的测试代码显式地运行每个方法 1,000 次,使用 秒表 测量每次执行时间,并忽略所有发生垃圾收集的结果。然后获取每个方法的平均执行时间。

var measurements =
methods
.Select((m, i) => i)
.ToDictionary(i => i, i => new List<double>());

for (var run = 0; run < 1000; run++)
{
for (var i = 0; i < methods.Length; i++)
{
var sw = Stopwatch.StartNew();
var gccc0 = GC.CollectionCount(0);
var r = methods[i]();
var gccc1 = GC.CollectionCount(0);
sw.Stop();
if (gccc1 == gccc0)
{
measurements[i].Add(sw.Elapsed.TotalMilliseconds);
}
}
}

var results =
measurements
.Select(x => new
{
index = x.Key,
count = x.Value.Count(),
average = x.Value.Average().ToString("0.000")
});

这是结果(从最慢到最快排序):

+---------+-----------------------------------------------------------+
| average | method |
+---------+-----------------------------------------------------------+
| 14.879 | () => enumerable.Select(x => x).ToList().Count(), |
| 14.188 | () => list.Select(x => x).ToList().Count(), |
| 10.849 | () => enumerable.Where(x => x % 2 == 0).ToList().Count(), |
| 10.080 | () => enumerable.ToList().Count(), |
| 9.562 | () => enumerable.Select(x => x).Count(), |
| 8.799 | () => list.Where(x => x % 2 == 0).ToList().Count(), |
| 8.350 | () => enumerable.Where(x => x % 2 == 0).Count(), |
| 8.046 | () => list.Select(x => x).Count(), |
| 5.910 | () => list.Where(x => x % 2 == 0).Count(), |
| 4.085 | () => enumerable.Count(), |
| 1.133 | () => list.ToList().Count(), |
| 0.000 | () => list.Count, |
| 0.000 | () => list.Count(), |
+---------+-----------------------------------------------------------+

这里有两件事很重要。

第一,任何带有 .ToList() 内联的方法都比没有它的等效方法慢得多。

第二,LINQ 运算符在可能的情况下利用可枚举的基础类型来简化计算。 enumerable.Count()list.Count() 方法显示了这一点。

list.Countlist.Count() 调用之间没有区别。所以关键比较是 enumerable.Where(x => x % 2 == 0).Count()enumerable.Where(x => x % 2 == 0) .ToList().Count() 调用。由于后者包含一个额外的操作,我们预计它需要更长的时间。它几乎长了 2.5 毫秒。

我不知道你为什么说你要调用两次计数代码,但如果你这样做最好构建列表。如果不只是在查询后调用普通的 .Count()

关于c# - IEnumerable.Count() 或 ToList().Count,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com