Подтвердить что ты не робот

С# Преобразование списка <int> в список <double>

У меня есть List<int>, и я хочу преобразовать его в List<double>. Есть ли способ сделать это иначе, чем просто цикл через List<int> и добавление к новому List<double>, например:

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

Есть ли способ сделать это? Я использую С# 4.0, поэтому ответ может воспользоваться новыми языковыми функциями.

4b9b3361

Ответ 1

Вы можете использовать методы LINQ:

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

или

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

Кроме того, класс списка имеет метод ForEach:

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

Ответ 2

Вы можете использовать Select, как предложено другими, но вы также можете использовать ConvertAll:

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

Это имеет два преимущества:

  • Он не требует LINQ, поэтому, если вы используете .NET 2.0 и не хотите использовать LINQBridge, вы все еще может использовать его.
  • Это более эффективно: метод ToList не знает размер результата Select, поэтому ему может потребоваться перераспределение буферов по мере его поступления. ConvertAll знает размер источника и назначения, поэтому он может сделать все за один раз. Он также может делать это без абстракции итераторов.

Недостатки:

  • Он работает только с List<T> и массивами. Если вы получите простой IEnumerable<T>, вам нужно будет использовать Select и ToList.
  • Если вы используете LINQ сильно в своем проекте, может быть более последовательным продолжать использовать его здесь.

Ответ 3

Вы можете сделать это, используя Выбрать метод расширения:

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

Ответ 4

Вы можете использовать метод ConvertAll внутри .Net Framework 2.0, вот пример

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

Ответ 5

Вы можете использовать Select или ConvertAll. Имейте в виду, что ConvertAll доступен также в .Net 2.0

Ответ 6

Вы можете использовать группу методов:

lstDouble = lstInt.Select(Convert.ToDouble)