使用LINQ将数组对象[,]转换为数组

时间:2015-03-20 22:51:39

标签: c# performance linq sap

我从外部系统获得的信息总是以下列格式返回给我:

SAP data

我需要将此信息从object [,]转换为“|”上的数组拆分。 我一直在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#,我遇到了以下错误:

LINQ ERROR

使用此代码时:

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>();

此问题有哪些(如果有)解决方法?

3 个答案:

答案 0 :(得分:5)

您很可能必须使用Cast来电:

from TempResult in (vSAPdataTemp as object[,]).Cast<object>()
(...)

那是因为object[,]实现了非通用的IEnumerable,它与LINQ无法很好地协作。 (我不知道为什么它在VB.NET中起作用)。

答案 1 :(得分:0)

你能做这样的事吗?

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);

结果:

  

Elapsed:00:00:06.25855573

答案 2 :(得分:0)

感谢@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();

Result