Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将二维数组转换为c中的连接字符串列表_C#_Arrays_List_Linq - Fatal编程技术网

C# 将二维数组转换为c中的连接字符串列表

C# 将二维数组转换为c中的连接字符串列表,c#,arrays,list,linq,C#,Arrays,List,Linq,我想有效地将多维对象数组转换为一系列连接的数组 首先,我将2D数组转换为数组列表: object[,] data; // This contains all the data. int count = 0; List<string[]> dataList = data.Cast<string>() .GroupBy(x => count++ / data.GetLength(1))

我想有效地将多维对象数组转换为一系列连接的数组

首先,我将2D数组转换为数组列表:

object[,] data; // This contains all the data.
int count = 0;
List<string[]> dataList = data.Cast<string>()
                          .GroupBy(x => count++ / data.GetLength(1))
                          .Select(g => g.ToArray())
                          .ToList();
现在我要做的是创建一个列表,在这里我修剪并连接每个数组中的所有数据。为了澄清我的意思,我可以使用以下方法:

List<string> dataListCombined = new List<string>();
foreach (string[] s in dataList)
{
    for (int i = 0; i < s.Length; i++)
    {
        s[i] = s[i].Trim();
    }
    dataListCombined.Add(string.Join(",", s));
}
但我只是想知道是否有更有效的方法。我可以改变上面使用的LINQ Im吗?
谢谢

以下LINQ代码将在两个块中产生与完整代码相同的结果:

此代码适用于任何秩维度的多维数组


访问索引值时可以使用LINQ的一个技巧是模拟具有Enumerable.Range的循环。这并不是更有效,甚至更清晰,但允许代码轻松索引:

var dataCombined = Enumerable.Range(0, data.GetLength(0))
                             .Select(ri => String.Join(",", Enumerable.Range(0, data.GetLength(1))
                                                                      .Select(ci => data[ri,ci].ToString()
                                                                                               .Trim())))
                             .ToList();

你能给我们看一个数据样本吗?例如,如果我们可以看到数据及其格式以及您希望数据最终的外观,这将非常有用。除了我上面的评论,我还想知道,在您的第一个代码示例中,为什么不将数据转换为列表而不是列表。一般来说,列表比数组更容易处理。在LINQ谓词中加入副作用是个坏主意。正确的函数式编程方法是使用select的一种形式,使用一个谓词获取索引,并使用索引进行分组,这可能还需要创建一个包含索引和原始数据的匿名对象。设置起来需要做更多的工作,但是谓词作为纯函数应该是这样工作的。我相信LINQ谓词中的副作用构成了未定义的行为。请看@RashidAli的技术,这不是一种返回数组行的有效方法,使用这种副作用是一个非常糟糕的主意-为什么要在您已经知道如何访问数据的情况下对其进行分组?您不用直接访问,而是支付除法操作、散列、将组数据存储在内部列表中并将其发送到下一步。所有这些字符串操作都会生成临时对象,这些临时对象必须进行GC处理,这又增加了一层效率低下的问题。您忘记分配Item=s,而且由于OP似乎对修剪数据感兴趣,所以将其设置为s。这是答案,但我必须更新int-arrayDimensions=data.Rank;int arrayDimensions=data.GetLength1;
var dataCombined = Enumerable.Range(0, data.GetLength(0))
                             .Select(ri => String.Join(",", Enumerable.Range(0, data.GetLength(1))
                                                                      .Select(ci => data[ri,ci].ToString()
                                                                                               .Trim())))
                             .ToList();