【问题标题】:C# LINQ query on multidimensional array多维数组上的 C# LINQ 查询
【发布时间】:2015-01-28 02:40:05
【问题描述】:

如何正确使用以下 LINQ 查询?我想创建一个只包含大于 5 的值的一维数组。我不明白为什么它不能迭代这个多维数组,但如果我使用 foreach,它实际上会迭代。

// Create an multidimensional array, then just put numbers into it and print the array.  
int[,] myArr = new int[5,6];
int rows = myArr.GetLength(0);
int cols = myArr.GetLength(1);
for (int i = 0; i < rows; i++)
{
    for (int k = 0; k < cols; k++)
    {
        myArr[i,k] = i + k;
        Console.Write(myArr[i,k]);
    }
    Console.WriteLine("");

}

var highList = from val in myArr where (val > 5) select val;

错误是:

找不到源类型“int[*,*]”的查询模式的实现。 'Where' 未找到。您是否缺少“System.Linq”的引用或使用指令?

我认为这可能会解决问题:

public static IEnumerator<int> GetEnumerator(int[,] arr)
{
    foreach(int i in arr)
    {
        yield return i;
    }
}

但它没有实现迭代器。

【问题讨论】:

    标签: c# arrays linq multidimensional-array


    【解决方案1】:

    问题是多维(矩形)数组实现了IEnumerable,而不是IEnumerable&lt;T&gt;。幸运的是,您可以使用 Cast 来解决这个问题 - 如果您明确指定范围变量的类型,则会自动调用 Cast

    var highList = from int val in myArr where (val > 5) select val;
    

    或者没有不必要的括号:

    var highList = from int val in myArr where val > 5 select val;
    

    或者直接使用方法调用,因为它是一个非常简单的查询表达式:

    var highList = myArr.Cast<int>().Where(val => val > 5);
    

    认为不过,这会将每个元素装箱。您可以添加 自己的 Cast 扩展方法来避免这种情况:

    public static class RectangularArrayExtensions
    {
        public static IEnumerable<T> Cast<T>(this T[,] source)
        {
            foreach (T item in source)
            {
                yield return item;
            }
        }
    }
    

    【讨论】:

    • "如果您明确指定范围变量的类型,则会自动调用 Cast" 在使用 Linq 的 7 年中,我从未见过这种情况。我认为那在规范中的某个地方?
    • @DStanley:是的,请参阅 MS C# 5 规范的第 7.16.2.2 节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2015-04-30
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多