C# 使用LINQ将数组对象[,]转换为数组
我有来自外部系统的信息,这些信息总是以以下格式返回给我: 我需要将此信息从对象[,]转换为|上的数组拆分。 我一直在使用VB中的LINQ来获取以下信息:C# 使用LINQ将数组对象[,]转换为数组,c#,performance,linq,sap,C#,Performance,Linq,Sap,我有来自外部系统的信息,这些信息总是以以下格式返回给我: 我需要将此信息从对象[,]转换为|上的数组拆分。 我一直在使用VB中的LINQ来获取以下信息: Dim vSAPdataTemp(,) As Object = Local_SAPtableData.Data Dim vLinq = From TempResult In vSAPdataTemp Select Value = Array.ConvertAll(TempResult.ToString.Split(RF
Dim vSAPdataTemp(,) As Object = Local_SAPtableData.Data
Dim vLinq = From TempResult In vSAPdataTemp
Select Value = Array.ConvertAll(TempResult.ToString.Split(RFC_DelimiterChar),
Function(vVal) CObj(vVal.ToString.Trim))
Dim vNewSAPdata() As Object = vLinq.ToArray
但现在我要转到C,我遇到了以下错误:
使用此代码时:
var vSAPdataTemp = Local_SAPtableData.Data;
Local_SAPtableData.FreeTable();
fw.gcCleaner();
Local_SAPtableData = null;
var vLinq = (from TempResult in (vSAPdataTemp as Object[,])
select string strValue = Array.ConvertAll(TempResult.Split(stcVariables.strSapRfcDelimiterChar),
vVal => (vVal as object).ToString().Trim()));
var vNewSAPdata = vLinq.ToArray<string>();
如果此问题存在任何解决方法,该怎么办?您很可能必须使用Cast call:
这是因为对象[,]实现了非泛型的IEnumerable,这不适用于LINQ。我一开始不知道它为什么在VB.NET中工作。您很可能必须使用Cast调用:
这是因为对象[,]实现了非泛型的IEnumerable,这不适用于LINQ。我一开始不知道它为什么在VB.NET中工作。你能这样做吗
var items = new List<string>();
foreach (var vSAPdata in vSAPdataTemp)
{
items.AddRange(vSAPdata.ToString().Split('|'));
}
更新
使用500万条记录进行测试
var maxElements = 5000000;
var vSAPdataTemp = new Object[maxElements, 1];
for (int i = 0; i < maxElements; i++)
{
vSAPdataTemp[i, 0] = string.Format("{0}first|{0}second|{0}third", i);
}
var items = new List<string>();
var sw = new Stopwatch();
sw.Start();
foreach (var vSAPdata in vSAPdataTemp)
{
items.AddRange(vSAPdata.ToString().Split('|'));
}
sw.Stop();
Console.WriteLine("Elapsed: {0}", sw.Elapsed);
结果:
时间:00:00:06.258555573
你能这样做吗
var items = new List<string>();
foreach (var vSAPdata in vSAPdataTemp)
{
items.AddRange(vSAPdata.ToString().Split('|'));
}
更新
使用500万条记录进行测试
var maxElements = 5000000;
var vSAPdataTemp = new Object[maxElements, 1];
for (int i = 0; i < maxElements; i++)
{
vSAPdataTemp[i, 0] = string.Format("{0}first|{0}second|{0}third", i);
}
var items = new List<string>();
var sw = new Stopwatch();
sw.Start();
foreach (var vSAPdata in vSAPdataTemp)
{
items.AddRange(vSAPdata.ToString().Split('|'));
}
sw.Stop();
Console.WriteLine("Elapsed: {0}", sw.Elapsed);
结果:
时间:00:00:06.258555573
感谢@MarcinJuraszek为我的问题提供了答案。我只想发布我的具体案例的解决方案:
var vSAPdataTemp = Local_SAPtableData.Data;
string[][] vLinq = (vSAPdataTemp as Object[,]).Cast<string>()
.Select(str => str.Split(stcVariables.strSapRfcDelimiterChar)
.Select(stra => stra.Trim()).ToArray()).ToArray();
感谢@MarcinJuraszek为我的问题提供了答案。我只想发布我的具体案例的解决方案:
var vSAPdataTemp = Local_SAPtableData.Data;
string[][] vLinq = (vSAPdataTemp as Object[,]).Cast<string>()
.Select(str => str.Split(stcVariables.strSapRfcDelimiterChar)
.Select(stra => stra.Trim()).ToArray()).ToArray();
@MarcinJuraszek:是的,先生。正如你所知,这是LINQ,而不是你标题中的链接:@BradleyDotNET我的坏!,谢谢你的更正@MarcinJuraszek:是的,先生。正如你所知,这是LINQ,而不是你标题中的链接:@BradleyDotNET我的坏!,谢谢你的更正!谢谢你的回复;但有时我有超过500000张唱片。做一个循环不是一个选项。我测试了上面的500万条记录,它在6.2秒内运行…我遗漏了什么?谢谢你的回复;但有时我有超过500000张唱片。做一个循环不是一个选项。我测试了上面的500万条记录,它运行了6.2秒…我遗漏了什么?