簡體   English   中英

將數組轉換為自定義對象列表c#

[英]Convert Array to custom object list c#

我有一個數組: -

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

將Array轉換為字符串嘗試這種方式

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM