如何将数据库结果转换为二维数组

本文关键字:转换 二维数组 结果 数据库 | 更新日期: 2023-09-27 18:28:04

我只想从表中取两列,不把它放在列表中,而是放在字符串的2D数组string[,]中。我在这里做什么:

string[,] array = _table.Where(x => x.IsDeleted == false)
     .Select(y => new string[,] {{y.Name, y.Street}});

现在我不知道如何执行它。如果我执行.ToArray(),我会得到string[][,]。有人知道如何使用LINQ在不使用循环的情况下解决它吗?

如何将数据库结果转换为二维数组

string[,]不可能作为LINQ查询的输出。

作为一种选择,你可以尝试这样的东西:-

 string[][] array = _table.Where(x => x.IsDeleted == false).Select(y => new[] {y.Name, y.Streete}).ToArray();

var array =_table.Select(str=>str.Where(x => x.IsDeleted == false)
        .Select(y => new[] {y.Name, y.Street})
        .ToArray())
    .ToArray();

LINQ中没有任何东西可以让您创建多维数组。但是,您可以创建自己的扩展方法,该方法将返回TResult[,]:

public static class Enumerable
{
    public static TResult[,] ToRectangularArray<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult[]> selector)
    {
        // check if source is null
        if (source == null)
            throw new ArgumentNullException("source");
        // load all items from source and pass it through selector delegate
        var items = source.Select(x => selector(x)).ToArray();
        // check if we have any items to insert into rectangular array
        if (items.Length == 0)
            return new TResult[0, 0];
        // create rectangular array
        var width = items[0].Length;
        var result = new TResult[items.Length, width];
        TResult[] item;
        for (int i = 0; i < items.Length; i++)
        {
            item = items[i];
            // item has different width then first element
            if (item.Length != width)
                throw new ArgumentException("TResult[] returned by selector has to have the same length for all source collection items.", "selector");
            for (int j = 0; j < width; j++)
                result[i, j] = item[j];
        }
        return result;
    }
}

但正如您所看到的,它仍然首先将所有结果放入锯齿状数组TResult[][]中,然后使用循环将其重写为多维数组。

用法示例:

string[,] array = _table.Where(x => x.IsDeleted == false)
                        .ToRectangularArray(x => new string[] { x.Name, x.Street });