Конвертировать IEnumerable <T>в строку [] - PullRequest
9 голосов
/ 27 сентября 2011

У меня есть объект с именем Product

class Product
{
     public Id { get; set; }
     public Name { get; set; }
}

, и у меня есть список всех продуктов:

IEnumerable<Product> products = _productRepository.GetAll()

Я хочу получить массив строк из этого списка продуктов, этомассив будет содержать идентификатор продукта + имя продукта, поэтому, когда я пытаюсь привести его с помощью следующего кода:

string[] s = products.Cast<string>().ToArray();

, я получил следующее исключение:

Unable to cast object of type 'Product' to type 'System.String'

исключение действительно делаетОчень много, так что если у меня есть метод

string ProductToString(Product p)
{
    return p.Name;
}

или переопределение ToString () для объекта продукта, то как я могу использовать этот метод для получения списка строк [] из IEnumerable?

Ответы [ 4 ]

25 голосов
/ 27 сентября 2011

Хорошо, учитывая тот метод, который вы можете использовать 1 :

string[] s = products.Select<string>(ProductToString).ToArray();

Однако было бы более идиоматичным делать это без отдельного метода, обычноиспользуя лямбда-выражение:

// Matches ProductToString, but not your description
string[] s = products.Select(p => p.Name).ToArray();

Я бы использовал отдельный метод, только если он собирался вызываться из разных мест (обеспечение согласованности) или выполнял большую работу.

РЕДАКТИРОВАТЬ: Я только что заметил, что ваше описание (требуется идентификатор + имя) на самом деле не соответствует указанному вами ProductToString методу (который просто дает имя).Для идентификатора + имя я бы использовал:

string[] s = products.Select(p => p.ID + " " + p.Name).ToArray();

или

string[] s = products.Select(p => string.Format("{0} {1}", p.ID, p.Name))
                     .ToArray();

Или, конечно, вы можете просто изменить свой метод ProductToString.

В качестве альтернативыВы можете переопределить ToString() в Product, если это обычно , как вы хотите преобразовать Product в string.Затем вы можете использовать преобразование группы методов или лямбда-выражение для вызова ToString.


1 Возможно, вам не нужно явно указывать аргумент типа -что:

string[] s = products.Select(ProductToString).ToArray();

будет работать нормально - правила вывода типов и преобразования групп методов меня всегда смущают, а поведение компилятора со временем немного меняется.Быстрый тест сейчас выглядит так: работает , но могут быть тонкости в слегка различных ситуациях.

2 голосов
/ 27 сентября 2011
string[] s = products.Select(p => p.Name).ToArray();

Или, если вам нужен Id + Имя:

string[] s = products.Select(p => p.Id + ' ' + p.Name).ToArray();
1 голос
/ 27 сентября 2011

использование

string[] s = (from p in products select p.Id.ToString() + " " + p.Name.ToString()).ToArray();
0 голосов
/ 04 декабря 2018

Это сработало для меня:

String.Join(";", mi_customer.Select(a => a.Id).Cast<string>().ToArray());

Где mi_customer должен быть вашим объектом, в моем случае это таблица.

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