C# 将二维数组转换为c中的连接字符串列表
我想有效地将多维对象数组转换为一系列连接的数组 首先,我将2D数组转换为数组列表: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))
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();