2012-08-15 13 views
15

Chcę przekonwertować ArrayList na List<string> przy użyciu LINQ. Próbowałem ToList() ale że podejście nie działa:Konwertuj "ArrayList" na "Listę <string>" (lub "Listę <T>") przy użyciu LINQ

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

Możliwy duplikat (http://stackoverflow.com/ pytania/786268/in-net-how-do-you-convert-an-arraylist-to-a-strongly-typed-generic-list-withou) –

Odpowiedz

23

kodzie faktycznie pokazuje List<ArrayList> aniżeli pojedynczy ArrayList. Jeśli naprawdę mam tylko jeden ArrayList, to prawdopodobnie chcesz:

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

Cast połączenie jest wymagane, ponieważ ArrayList jest słabo wpisane - to tylko realizuje IEnumerable nie IEnumerable<T>. Prawie wszystkie operatory LINQ w LINQ to Objects są oparte na IEnumerable<T>.

Zakładamy, że wartości w ramach ArrayList są naprawdę ciągami. Jeśli nie, musisz podać nam więcej informacji o tym, jak każdy element ma zostać przekonwertowany na ciąg znaków.

2

Zakładam, że pierwsza linia miała być ArrayList resultsObjects = new ArrayList();.

Jeśli obiekty wewnątrz ArrayList są określonego typu, można użyć metody Cast<Type> rozszerzenia:

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

Jeśli są dowolne obiekty w ArrayList które chcesz konwertować do strun, można użyj tego:

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

można konwertować ArrayList elementów do tablicy za pomocą ArrayList.ToArray()object[] meto re.

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(); 
0

Można również użyć OfType <> Metoda LINQ, w zależności od tego, czy chcesz podnieść wyjątek, jeśli jeden z elementów w ArrayList nie jest lany do żądanego typu. Jeśli twoja lista zawiera obiekty, które nie są ciągami, funkcja OfType() zignoruje je.

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

wyjściowe: [? W .NET, w jaki sposób przekonwertować ArrayList do silnie typami listy rodzajowe bez używania foreach]

Me 
You 
Powiązane problemy