JSON в C #: преобразовать массив двойных чисел в массив целых чисел? - PullRequest
0 голосов
/ 20 января 2010

У меня есть массив значений типа double, возвращаемый библиотекой JSON. После запуска метода декодирования парсера JSON это появляется в окне локалей C #:

Name     Value           Type
myObj    Count=4         object {System.Collections.ArrayList}
[0]      100.0           object {double}
[1]      244.0           object {double}
[2]      123.0           object {double}
[3]      999.0           object {double}

Моя цель - создать массив целых чисел из этого ArrayList. Было бы просто повторить и сделать это по одному значению за раз, но я хотел бы знать, как это сделать, используя встроенные функции конвертера. Я читал theads на ConvertAll, но я не могу заставить его работать.

У меня нет контроля над библиотекой JSON, поэтому я должен начать с ArrayList.

Спасибо

Ответы [ 5 ]

2 голосов
/ 20 января 2010

Linq:

var array = (from double d in list
             select (int)d).ToArray();
1 голос
/ 20 января 2010

Вы должны быть осторожны с ArrayList с из-за бокса. Таким образом:

// list is ArrayList      
int[] array = Array.ConvertAll(list.ToArray(), o => (int)(double)o);

Обратите внимание, что актерский состав оформлен как (int)(double). Это сначала распаковывает в штучной упаковке double, а затем приводит к int.

Для этого в более старых версиях .NET

// list is ArrayList
int[] array = Array.ConvertAll(
    list.ToArray(),
    delegate(object o) { return (int)(double)o; }
);

Альтернатива

// list is ArrayList
int[] array = Array.ConvertAll(
    (double[])list.ToArray(typeof(double)),
    o => (int)o
);

Здесь нам не нужна операция распаковки, потому что мы сначала преобразовали ArrayList в массив распакованных double s.

Для этого в старых версиях .NET

// list is ArrayList
int[] array = Array.ConvertAll(
    (double[])list.ToArray(typeof(double)),
    delegate(double o) { return (int)o; }
);
1 голос
/ 20 января 2010

Я бы подумал что-то вроде этого (с конвертером):

    private void Main()
    {
        List<Double> lstd = new List<Double>();

        lstd.Add(100.0);
        lstd.Add(244.0);
        lstd.Add(123.0);
        lstd.Add(999.0);

        List<int> lsti = lstd.ConvertAll(new Converter<double, int>(DoubleToInt));

    }


    public static int DoubleToInt(double dbl)
    {
        return (int)dbl;
    }
0 голосов
/ 20 января 2010

Опции linq более чистые, но если у вас нет linq.

//Assuming someValues is your input array and you're sure you don't need to check the types
int[] outputValues = new int[someValues.Count];
for (int i = 0; i < someValues.Count; i++)
   outputValues[i] = (int)someValues[i];
0 голосов
/ 20 января 2010

Если вам нужен образец рабочего решения с использованием ConvertAll, вот небольшой фрагмент кода.

 public static void testCOnvertAll()
        {
            List<double> target = new List<double>();
            target.Add(2.3);
            target.Add(2.4);
            target.Add(3.2);

            List<int> result = target.ConvertAll<int>(new Converter<double, int>(DoubleToInt));

        }

        public static int DoubleToInt(double toConvert)
        {
            return Convert.ToInt32(toConvert);
        }
...