2009-05-15 11 views
14

ok Poddaję się, jak to zrobić w jednym wierszu?Jak przekonwertować obiekt [] na listę <string> w jednej linii C# 3.0?

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    //List<string> fields = values.ToList<string>(); 
    //List<string> fields = values as List<string>; 
    //List<string> fields = (List<string>)values; 

    List<string> fields = new List<string>(); 
    foreach (object value in values) 
    { 
     fields.Add(value.ToString()); 
    } 

    //process the fields here knowning they are strings 
    ... 
} 
+2

Technicznie jest to C# 3.0, który może być użyty do kierowania na platformy .NET w wersji 2.0, 3.0 lub 3.5 w VS2008. Mylące, wiem :) – Lucas

+0

poprawne, dzięki –

Odpowiedz

45

Czy używasz C# 3.0 z LINQ? Jest to dość proste następnie:

List<string> fields = values.Select(i => i.ToString()).ToList(); 
+4

Nie widzę nigdzie, że tablica obiektów była w rzeczywistości tablicą łańcuchów. Ta odpowiedź jest poprawna, ponieważ np. Duplikaty * dokładnie * to, co OP opublikował w jedno-liniowej. –

+1

@Andrew: Tak, dobra uwaga. Jasno przeczytałem to pytanie zbyt szybko. Zastrzeżenie wspomniane w moim poście. – Noldorin

+0

jak poprawnie założyłeś z kontekstu, obiekty pochodzą z XAML i teoretycznie mogą być dowolnego typu, więc z tą odpowiedzią, gdy wysyłam liczbę całkowitą, to jest ona poprawnie konwertowana na ciąg, idealny –

16

Jeśli masz dostępne LINQ (.NET 3.5) i C# 3.0 (dla metod rozszerzenie), to nie jest całkiem ładna, jedna wkładka:

var list = values.Cast<string>().ToList(); 

Nie zamierzamy dostać wszystko znacznie krótszy niż opublikowany dla .NET 2.0/C# 2.0.

Zastrzeżenie: Właśnie zdałem sobie sprawę, że twoje object[] niekoniecznie jest typu string. Jeśli tak jest, skorzystaj z metody Matta Hamiltona, która dobrze spełnia swoją funkcję. Jeśli element twojej tablicy jest w rzeczywistości typu string, to moja metoda oczywiście zadziała.

+2

wspaniała odpowiedź - znacznie prostsza niż wybór linq. –

+0

Należy zauważyć, że to się nie powiedzie, jeśli dowolna wartość nie jest łańcuchem. –

+0

@mausch: Tak, właśnie zredagowałem odpowiedź, aby dodać zastrzeżenie. – Noldorin

2

Choć nie jeden liniowej w odniesieniu do listy <> deklarację, daje ten sam efekt bez konieczności Linq.

List<string> list = new List<string>(); 
Array.ForEach(values, value => list.Add(value.ToString())); 
4

Jeszcze jeden wariant, który może być poprawne:

List<string> list = values.OfType<string>().ToList(); 

To będzie odfiltrować żadnych przedmiotów na pierwotnej liście, które nie są string obiekty, zamiast albo rzuca wyjątek lub próbuje je wszystkie konwertować w struny.

+0

.OfType jest bardzo interesujący, zapamięta go, ale w tym kontekście muszę wyświetlić trzy wartości, niezależnie od tego, jakie są (ciąg, liczba całkowita itp.) –

9

C# 2.0:

List<string> stringList = new List<string>(Array.ConvertAll<object,string>(values, new Converter<object,string>(Convert.ToString))); 
3
Array.ConvertAll(inputArray, p => p.ToString()) 

Przekształca tablicę object typu do tablicy string. Możesz przekonwertować na inną tablicę typów, zmieniając wyrażenie lambda.

Powiązane problemy