LINQ语句的区别?选择位置

093gszye  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(151)

下面的LINQ语句有什么区别吗?

var value  = source.Select(y => y.Id).Where(y => !string.IsNullOrEmpty(y)).ToList();

var value  = source.Where(y => !string.IsNullOrEmpty(y.Id)).Select(y => y.Id).ToList();

在数据加载和性能方面。

xoefb8l8

xoefb8l81#

我在上面做了一些基准测试:

[MemoryDiagnoser(false)]
public class Benchmarks
{
    private DataObject[] Data { get; set; }

    [GlobalSetup]
    public void Setup()
    {
        Data = new DataObject[1000000];
        for (int i = 0; i < Data.Length; i++)
        {
            Data[i] = new DataObject
            {
                Id = Guid.NewGuid().ToString(),
                Name = Guid.NewGuid().ToString(),
            };
        }
    }

    [Benchmark]
    public void WhereSelect()
    {
        var newColl = Data.Where(x => !string.IsNullOrEmpty(x.Id)).Select(x => x.Id).ToList();
    }

    [Benchmark]
    public void SelectWhere()
    {
        var newColl = Data.Select(x => x.Id).Where(x => !string.IsNullOrEmpty(x)).ToList();
    }
}

public class DataObject
{
    public string Id { get; set; }
    public string Name { get; set; }
}

数组被填充了1,000,000个元素,我在其中执行了两个方法。这是结果(BenchmarkRunner.Run<Benchmarks>()):
| 方法|是说|误差|StdDev|分配|
| --|--|--|--|--|
| WhereSelect| 17.12毫秒|0.341毫秒|0.778毫秒|16 MB|
| 选择地点|20.83毫秒|0.549毫秒|1.619毫秒|16 MB|
所以你可以清楚地看到.Select(...).Where(...)更快。当然,这是一个非常大的数组。对于一个1000个元素的数组,这是结果:
| 方法|是说|误差|StdDev|分配|
| --|--|--|--|--|
| WhereSelect| 5.955美元|0.1180 us| 0.1359 us| 16.31 KB|
| 选择地点|9.415美国|0.1596 us| 0.1493 us| 16.31 KB|
请注意,现在大约是 * 微秒。但我们仍然有一个明显的赢家。

请注意,这仅测试WhereSelectIEnumerable实现。对于IQueryable,可能完全不同。

相关问题