Преобразовать эту переменную в список длинных? - PullRequest
1 голос
/ 14 марта 2011

У меня есть прикрепленный экран, и мне нужно знать, как я могу преобразовать список в список длинных?

var x = SchedulerMatrixStorage.Resources.Items.Select(col => col.Id);

Где, Id имеет тип Object

enter image description here

Ответы [ 6 ]

5 голосов
/ 14 марта 2011

Поскольку ваш список выглядит однородным, вы можете воспользоваться встроенными функциями преобразования, которые являются частью .NET Framework:

var x = SchedulerMatrixStorage.Resources.Items
       .Select(col => Convert.ToInt64(col.Id)).ToList();

Статический класс Convert предоставляет несколько функций преобразованияодна группа из которых преобразует объекты различных типов в различные встроенные типы значений, например long.Большинство из этих функций также имеют перегрузку, которая принимает параметр object (который, я предполагаю, является тем, что в основном содержит ваша коллекция).

Обратите внимание, что эта функция завершится с ошибкой во время выполнения, если предоставленный объект является чем-то, чтоне может быть преобразован в long (например, если вы должны были передать, скажем, Form), но, судя по вашему скриншоту, это должно работать для вас.

2 голосов
/ 14 марта 2011

Если Id имеет тип object, но значение всегда является строкой, вы можете использовать:

var x = SchedulerMatrixStorage.Resources
                              .Items
                              .Select(col => long.Parse((string)col.Id)
                              .ToList();

Однако не ясно, что результат всегда равен строке. Вы должны дать нам больше информации о col.Id.

В общем, вы хотите что-то вроде этого:

var x = SchedulerMatrixStorage.Resources
                              .Items
                              .Select(ConvertColumnId)
                              .ToList();

private static long ConvertColumnId(object id)
{
    // Do whatever it takes to convert `id` to a long here... for example:
    if (id is long)
    {
        return (long) id;
    }
    if (id is int)
    {
        return (int) id;
    }
    string stringId = id as string;
    if (stringId != null)
    {
        return long.Parse(stringId);
    }
    throw new ArgumentException("Don't know how to convert " + id +
                                " to a long");
}
2 голосов
/ 14 марта 2011

Вы можете использовать long.Parse() в своем выражении Select, так как на скриншоте видно, что значения в коллекции Items могут быть строками:

var x = SchedulerMatrixStorage.Resources.Items.Select(col => 
   long.Parse(col.Id.ToString())).ToList();

x будет разрешен для типа System.Collections.Generic.List<long>.

0 голосов
/ 15 марта 2011

Ну, мне удалось преобразовать первую строку "-1" в правильную длину. Линия var x = SchedulerMatrixStorage.Resources.Items.Select(col => Convert.ToInt64(col.Id)).ToList(); отлично работает для меня сейчас. Идентификатор всегда будет длинным. С этим правилом, есть ли лучший способ сделать это? Я имею в виду, моя задача выполнена, но хотелось бы, чтобы LINQ предложил еще лучший метод ...

enter image description here

0 голосов
/ 14 марта 2011

Вероятно, самый быстрый способ - это:

var x = SchedulerMatrixStorage.Resources.Items.Select(col => col.Id).Cast<long>();

, хотя вы действительно должны убедиться, что у вас есть только те идентификаторы, которые задолго до того, как они были упакованы в качестве объекта.

0 голосов
/ 14 марта 2011

думаю, что это должно делать то, что вы хотите

var x = SchedulerMatrixStorage.Resources.Items.Select(col => col.Id).Cast<long>().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...