相关疑难解决方法(0)

我误解了LINQ to SQL .AsEnumerable()?

考虑以下代码:

var query = db.Table
              .Where(t => SomeCondition(t))
              .AsEnumerable();

int recordCount = query.Count();
int totalSomeNumber = query.Sum();
decimal average = query.Average();
Run Code Online (Sandbox Code Playgroud)

假设query需要很长时间才能运行.我需要获得记录数,总数SomeNumber已经返回,并在结束时取平均值.我以为根据我读的是.AsEnumerable()将执行使用LINQ到SQL,然后使用LINQ到对象的查询Count,Sum以及Average.相反,当我在LINQPad中执行此操作时,我看到相同的查询运行三次.如果我更换.AsEnumerable().ToList(),它只被查询一次.

我错过了什么AsEnumerable/做什么?

.net c# linq linq-to-sql

49
推荐指数
3
解决办法
1万
查看次数

在数组上使用AsEnumerable()有什么用?

我正在阅读Eric Lippert撰写的博客,他解释了为什么他几乎从不使用数组,以下部分让我很好奇:

如果您正在编写这样的API,请将数组包装在ReadOnlyCollection中并返回IEnumerable或IList或其他内容,但不返回数组. (当然,不要简单地将数组转换为IEnumerable并认为你已经完成了!那仍然是传递变量;调用者可以简单地转换回数组! 只有在读取数据时才传递出一个数组 -唯一的对象.)

所以我在收藏中乱七八糟:

string[] array = new[] { "cat", "dog", "parrot" };
IEnumerable<string> test1 = array.AsEnumerable();
string[] secondArray = (string[])test1;

//array1[0] is now also "whale"
array[0] = "whale";

//11 interfaces
var iArray = array.GetType().GetInterfaces();
//Still 11 interfaces??
var iTest1 = test1.GetType().GetInterfaces();
Run Code Online (Sandbox Code Playgroud)

我初始化数组,然后使用该AsEnumerable()方法就可以将其转换为一个IEnumerable(或因此我认为),但是当我将它转换回一个新的阵列,和原来的数组中改变一个值,值test1,并secondArray得到了改变,以.显然我只是对原始数组进行了2次新引用,而不是创建一个IEnumerableToArray()返回一个新数组的新引用.

当我比较数组的接口时IEnumerable,它们都具有相同的接口.如果数组实际上没有做任何事情,为什么数组有这个方法呢?我知道AsEnumerable()它有用Linq-to-entities来获取可枚举的方法IQueryable,但是为什么要将这个方法添加到数组中呢?这种方法有实际用途吗?

编辑: Tim Schmelter的评论提出了一个非常好的观点,不应该被忽视:

"它没有那么无用.你可以在不破坏其余代码的情况下改变实际类型.所以你可以用数据库查询或列表或hashset或其他任何东西替换数组,但是AsEnumerable总是有效,其余的代码也是如此所以AsEnumerable就像一份契约."

c# collections

10
推荐指数
2
解决办法
1494
查看次数

为什么要将AsEnumerable()方法应用于数组?

我正在阅读C#AsEnumerable:

"IEnumerable接口是一个通用接口.这意味着它定义了一个类型可以实现循环的模板.AsEnumerable方法,一个通用方法,允许你将特定类型转换为它的IEnumerable等价物"

接下来,代码示例:

using System;
using System.Linq;

class Program
{
   static void Main()
   {
       // Create an array type.
        int[] array = new int[2];
        array[0] = 5;
        array[1] = 6;
        // Call AsEnumerable method.
        var query = array.AsEnumerable();
        foreach (var element in query)
        {
            Console.WriteLine(element);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

听起来我需要将数组转换为IEnumerable类型对象以使用循环(foreach?).

但是将foreach直接应用于数组会产生完全相同的结果:

using System;
//using System.Linq;

class Program
{
    static void Main()
    {
        // Create an array type.
        int[] array = new …
Run Code Online (Sandbox Code Playgroud)

c# linq arrays ienumerable list

5
推荐指数
1
解决办法
2886
查看次数

标签 统计

c# ×3

linq ×2

.net ×1

arrays ×1

collections ×1

ienumerable ×1

linq-to-sql ×1

list ×1