C# Converting List<int> to List<double>

Viewed 31236

I have a List<int> and I want to convert it to a List<double>. Is there any way to do this other than just looping through the List<int> and adding to a new List<double> like so:

List<int> lstInt = new List<int>(new int[] {1,2,3});
List<double> lstDouble = new List<double>(lstInt.Count);//Either Count or Length, I don't remember

for (int i = 0; i < lstInt.Count; i++)
{
    lstDouble.Add(Convert.ToDouble(lstInt[0]));
}

Is there a fancy way to do this? I'm using C# 4.0, so the answer may take advantage of the new language features.

6 Answers

You can use Select as suggested by others, but you can also use ConvertAll:

List<double> doubleList = intList.ConvertAll(x => (double)x);

This has two advantages:

  • It doesn't require LINQ, so if you're using .NET 2.0 and don't want to use LINQBridge, you can still use it.
  • It's more efficient: the ToList method doesn't know the size of the result of Select, so it may need to reallocate buffers as it goes. ConvertAll knows the source and destination size, so it can do it all in one go. It can also do so without the abstraction of iterators.

The disadvantages:

  • It only works with List<T> and arrays. If you get a plain IEnumerable<T> you'll have to use Select and ToList.
  • If you're using LINQ heavily in your project, it may be more consistent to keep using it here as well.

You can use LINQ methods:

List<double> doubles = integers.Select<int, double>(i => i).ToList();

or:

List<double> doubles = integers.Select(i => (double)i).ToList();

Also, the list class has a ForEach method:

List<double> doubles = new List<double>(integers.Count);
integers.ForEach(i => doubles.Add(i));

You could do this using the Select extension method:

List<double> doubleList = intList.Select(x => (double)x).ToList();

You can use ConvertAll method inside of .Net Framework 2.0 here is an example

        List<int> lstInt = new List<int>(new int[] { 1, 2, 3 });
        List<double> lstDouble = lstInt.ConvertAll<double>(delegate(int p)
        {
            return (double)p;
        });

You can use Select or ConvertAll. Keep in mind that ConvertAll is available in .Net 2.0 too

Related