C# 将数组转换为自定义对象列表c

C# 将数组转换为自定义对象列表c,c#,arrays,custom-lists,C#,Arrays,Custom Lists,我有一个数组:- 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 20

我有一个数组:-

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运算符并将字符串数组分配给您的公文包对象。大概是这样的:

myArray.Select(array => new Portfolio { Field1 = array[0], Field2 = array[1] }).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);

没有从字符串[]到类公文包的神奇转换,您必须手动完成

这可能会起作用:

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();
如果您有这样一个类:

myArray.Select(array => new Portfolio { Field1 = array[0], Field2 = array[1] }).ToList()
public class Portfolio
{
    public List<double> Values { get; set; }
    public string Name { get; set; }
    public string TimeSpan { get; set; }
}

这将为您提供一个匿名对象数组。用你的公文包构造函数替换我的匿名构造函数。Lambda变量a是包含字符串值的数组。

创建一个构造函数,从barValues中获取项,并对这些项进行迭代器

比如:

然后在复制代码中:

foreach (var barValue in barValues)
{
    list.Add(new PortFolio(barValue[0], barValue[1], barValue[2], barValue[3], barValue[4]);    }
}

C是一种强类型语言。没有现成的方法可以神奇地将一串字符串投射到一个对象中

正确的方法是首先在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();
如果需要,您可以在构造函数中执行其他工作,例如将值转换为十进制、将方法转换为枚举以及将句点转换为两个日期时间

如果无法修改公文包类,因为它是第三方组件或超出了您的范围,则可以使用包含该逻辑的方法创建factory类:

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

你的职业是什么?您不能直接将字符串强制转换为公文包。似乎您的类应该存储字符串集合,对吗?还是单个数组在类中存储属性值?@pwas yes Portfolio有stringsImplicit转换在大多数情况下都不好,对于这样的复杂类型更是如此。