使用 LINQ 将数组对象 [] 转换为数组
Using LINQ to convert array object[,] to array
我从外部系统收到的信息总是 return 以下列格式发送给我:
我需要将此信息从对象[] 转换为按“|”拆分的数组。
我一直在 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
调用:
from TempResult in (vSAPdataTemp as object[,]).Cast<object>()
(...)
那是因为 object[,]
实现了非泛型 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);
结果:
Elapsed: 00:00:06.25855573
感谢@MarcinJuraszek 回答我的问题。我只想 post 我的具体案例的解决方案:
var vSAPdataTemp = Local_SAPtableData.Data;
string[][] vLinq = (vSAPdataTemp as Object[,]).Cast<string>()
.Select(str => str.Split(stcVariables.strSapRfcDelimiterChar)
.Select(stra => stra.Trim()).ToArray()).ToArray();
我从外部系统收到的信息总是 return 以下列格式发送给我:
我需要将此信息从对象[] 转换为按“|”拆分的数组。 我一直在 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
调用:
from TempResult in (vSAPdataTemp as object[,]).Cast<object>()
(...)
那是因为 object[,]
实现了非泛型 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);
结果:
Elapsed: 00:00:06.25855573
感谢@MarcinJuraszek 回答我的问题。我只想 post 我的具体案例的解决方案:
var vSAPdataTemp = Local_SAPtableData.Data;
string[][] vLinq = (vSAPdataTemp as Object[,]).Cast<string>()
.Select(str => str.Split(stcVariables.strSapRfcDelimiterChar)
.Select(stra => stra.Trim()).ToArray()).ToArray();