Преобразуйте 'ArrayList' в 'List <string>' (или 'List <T>'), используя LINQ

Я хочу преобразовать ArrayList в List<string> с помощью LINQ. Я пробовал ToList(), но этот подход не работает:

ArrayList resultsObjects = new ArrayList();
List<string> results = resultsObjects.ToList<string>();

Ответы

Ответ 1

В вашем коде на самом деле отображается List<ArrayList>, а не один ArrayList. Если у вас действительно есть только один ArrayList, вы, вероятно, захотите:

ArrayList resultObjects = ...;
List<string> results = resultObjects.Cast<string>()
                                    .ToList();

Вызов Cast требуется, потому что ArrayList слабо типизирован - он реализует только IEnumerable, а не IEnumerable<T>. Почти все операторы LINQ в LINQ to Objects основаны на IEnumerable<T>.

Предполагая, что значения внутри ArrayList действительно являются строками. Если это не так, вам нужно предоставить нам дополнительную информацию о том, как вы хотите, чтобы каждый элемент был преобразован в строку.

Ответ 2

Предполагаю, что ваша первая строка должна быть ArrayList resultsObjects = new ArrayList();.

Если объекты внутри ArrayList имеют определенный тип, вы можете использовать метод расширения Cast<Type>:

List<string> results = resultsObjects.Cast<string>().ToList();

Если в ArrayList есть какие-либо объекты, которые вы хотите преобразовать в строки, вы можете использовать это:

List<string> results = resultsObjects.Cast<object>().Select(x => x.ToString())
                                                    .ToList();

Ответ 3

Вы можете преобразовать элементы ArrayList в массив object[], используя метод ArrayList.ToArray().

 List<ArrayList> resultsObjects = new List<ArrayList>();
 resultsObjects.Add(new ArrayList() { 10, "BB", 20 });
 resultsObjects.Add(new ArrayList() { "PP", "QQ" });

 var list = (from arList in resultsObjects
                       from sr in arList.ToArray()
                        where sr is string 
                         select sr.ToString()).ToList();

Ответ 4

Вы также можете использовать метод LINQ OfType < > , в зависимости от того, хотите ли вы создать исключение, если один из элементов в списке arrayList не поддается заданному типу. Если ваш массивList имеет в нем объекты, которые не являются строками, OfType() будет игнорировать их.

var oldSchoolArrayList = new ArrayList() { "Me", "You", 1.37m };
var strings = oldSchoolArrayList.OfType<string>().ToList();
foreach (var s in strings)
    Console.WriteLine(s);

Вывод:

Me
You