Question

I have a array:-

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

I want to convert this array into my custom list :-

List<Portfolio> list = new List<Portfolio>();

I tried doing :-

List<Portfolio> list=myArray.Cast<Portfolio>().ToList();

But I get a error:-

System.InvalidCastException: Cannot cast from source type to destination type.

How do I do this conversion?

Was it helpful?

Solution

You will need to use the Select operator and assign your array of strings to your Portfolio object. Something like this:

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

OTHER TIPS

There is no "magic" conversion from string[] to your class PortFolio, you have to do it manually.

This could work:

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

If you have a class like this:

public class Portfolio
{
    public List<double> Values { get; set; }
    public string Name { get; set; }
    public string TimeSpan { get; set; }
}

Convert Array to string try this way

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

This gives you an array of anonymous objects. Just replace my anonymous constructor with your constructor of Portfolio. Lambda variable a is the array that contains the string values.

Create a constructor taking the items from barValues and iterator over those.

like:

class PortFolio()
{
    PortFolio(string e1, string e2, string e3, string period, string date)
    {
        // Copy to properties.
    }
    ...
}

Then in the code for copying:

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

C# is a strongly typed language. There is no out of the box way to magically cast a bunch of string into an object.

A correct way to do what you want is to first add a constructor on your Portfolio class that takes an array of strings and assign its values to your instance properties:

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

You can then use linq to build your list :

var portfoliosList = barValues.Select(values => new Portfolio(values)).ToList();

If required, you can do additional work in the constructor, for instance converting the values to decimal, the method to an Enum and the period as a couple of DateTime.

If you cannot modify the Portfolio class, because it's a third party component or out of your scope, you can create a factory class with a method containing that logic :

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

The linq query then becomes :

var list = barValues.Select(values => ProtfolioFactory.BuildPortfolio(values)).ToList();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top