C # Преобразование списка <int>в список <double> - PullRequest
24 голосов
/ 18 января 2010

У меня есть 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]));
}

Есть ли причудливый способ сделать это? Я использую C # 4.0, поэтому в ответе могут быть использованы новые возможности языка.

Ответы [ 6 ]

51 голосов
/ 18 января 2010

Вы можете использовать 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 в своем проекте, может быть более логичным продолжать использовать его и здесь.
32 голосов
/ 18 января 2010

Вы можете использовать методы 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));
8 голосов
/ 18 января 2010

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

List<double> doubleList = intList.Select(x => (double)x).ToList();
2 голосов
/ 18 января 2010

Вы можете использовать метод 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;
        });
1 голос
/ 21 февраля 2012

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

lstDouble = lstInt.Select(Convert.ToDouble)
0 голосов
/ 18 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...