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

4
我有一个数组:-
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: 无法从源类型转换为目标类型。

我该如何进行这种转换?


你知道什么是 Portfolio 类吗?你不能直接将 string 强制转换为 Portfolio。看起来你的类应该存储字符串集合,对吧?或者单个数组存储类属性的值? - user2160375
@pwas 是的,Portfolio 有字符串。 - user3146095
6个回答

5

您需要使用Select操作符并将字符串数组分配给Portfolio对象。类似这样:

myArray.Select(array => new Portfolio { Field1 = array[0], Field2 = array[1] }).ToList()

1
将数组转换为字符串,可以尝试以下方法。
       string[] arr = ...
       List<object> list= new List<object>(arr);

       foreach(object obj in arr)
       list.add(obj);

1

没有从 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; }
}

在大多数情况下,隐式转换都不好,尤其是对于像这样的复杂类型。 - Tim Schmelter

0
var converted = barValues.Select(a => new {Value1 = a[0], Value2= a[1]}).ToArray();

这将为您提供一个匿名对象数组。只需将我的匿名构造函数替换为您的 Portfolio 构造函数即可。Lambda 变量 a 是包含字符串值的数组。


0
创建一个构造函数,将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]);    }
}

0

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

如果需要的话,您可以在构造函数中进行额外的工作,例如将值转换为十进制数,将方法转换为枚举类型并将时间段表示为一对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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接