Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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# 使用LINQ将数组对象[,]转换为数组_C#_Performance_Linq_Sap - Fatal编程技术网

C# 使用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

我有来自外部系统的信息,这些信息总是以以下格式返回给我:

我需要将此信息从对象[,]转换为|上的数组拆分。 我一直在使用VB中的LINQ来获取以下信息:

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秒…我遗漏了什么?