将数组转换为自定义对象列表c#
本文关键字:对象 列表 自定义 数组 转换 | 更新日期: 2023-09-27 18:16:07
我有一个数组:-
private string[][] barValues = new string[][] { new string[]{ "1.9", "5.8", "4.8", "Since Inception", "24-Jan 2014 to 24 Jun 2014" },
new string[]{"1.2", "16.5","9.8", "Year to date","01-Apr 2014 to 24-Jun 2014" },
new string[]{"11.6","28.8","23.5","Last quarter","01-Jan to 24-Jun 2014"} };
我想把这个数组转换成我的自定义列表:-
List<Portfolio> list = new List<Portfolio>();
我试着做:-
List<Portfolio> list=myArray.Cast<Portfolio>().ToList();
但我得到一个错误:-
System.InvalidCastException:无法从源类型强制转换为目的地类型。
如何进行此转换?
您需要使用Select运算符并将字符串数组分配给Portfolio对象。类似这样的东西:
myArray.Select(array => new Portfolio { Field1 = array[0], Field2 = array[1] }).ToList()
从string[]
到您的类PortFolio
没有"神奇"的转换,您必须手动进行。
这可能奏效:
List<Portfolio> portFolioList = barValues
.Select(sArr => new Portfolio
{
Values = sArr.Take(3).Select(double.Parse).ToList(),
Name = sArr.Skip(3).First(),
TimeSpan = sArr.Last()
}).ToList();
如果你有这样的课程:
public class Portfolio
{
public List<double> Values { get; set; }
public string Name { get; set; }
public string TimeSpan { get; set; }
}
将数组转换为字符串尝试这种方式
string[] arr = ...
List<object> list= new List<object>(arr);
foreach(object obj in arr)
list.add(obj);
var converted = barValues.Select(a => new {Value1 = a[0], Value2= a[1]}).ToArray();
这将为您提供一个匿名对象数组。只需将我的匿名构造函数替换为您的Portfolio构造函数。Lambda变量a是包含字符串值的数组。
创建一个构造函数,从barValues中获取项,并在这些项上进行迭代器。
类似:
class PortFolio()
{
PortFolio(string e1, string e2, string e3, string period, string date)
{
// Copy to properties.
}
...
}
然后在代码中复制:
foreach (var barValue in barValues)
{
list.Add(new PortFolio(barValue[0], barValue[1], barValue[2], barValue[3], barValue[4]); }
}
一个正确的方法是首先在Portfolio类上添加一个构造函数,该构造函数接受字符串数组并将其值分配给实例属性:
class Portfolio
{
public string Value1 { get; set; }
public string Value2 { get; set; }
public string Value3 { get; set; }
public string Method { get; set; }
public string Period { get; set; }
public Portfolio(string[] values)
{
if (values != null)
{
this.Value1 = values.ElementAtOrDefault(0);
this.Value2 = values.ElementAtOrDefault(1);
this.Value3 = values.ElementAtOrDefault(2);
this.Method = values.ElementAtOrDefault(3);
this.Period = values.ElementAtOrDefault(4);
}
}
}
然后,您可以使用linq构建您的列表:
var portfoliosList = barValues.Select(values => new Portfolio(values)).ToList();
如果需要,您可以在构造函数中做额外的工作,例如将值转换为十进制,将方法转换为枚举,并将句点转换为DateTime。
如果您不能修改Portfolio类,因为它是第三方组件或超出了您的范围,那么您可以使用包含该逻辑的方法创建一个工厂类:
static class ProtfolioFactory
{
static public Portfolio BuildPortfolio(string[] values)
{
var portfolio = new Portfolio();
if (values != null)
{
portfolio.Value1 = values.ElementAtOrDefault(0);
portfolio.Value2 = values.ElementAtOrDefault(1);
portfolio.Value3 = values.ElementAtOrDefault(2);
portfolio.Method = values.ElementAtOrDefault(3);
portfolio.Period = values.ElementAtOrDefault(4);
}
return portfolio;
}
}
然后linq查询变为:
var list = barValues.Select(values => ProtfolioFactory.BuildPortfolio(values)).ToList();