W C # 3.0 możesz utworzyć anonimową klasę o następującej składni
var o = new { Id = 1, Name = "Foo" };
Czy istnieje sposób na dodanie tych anonimowych klas do ogólnej listy?
Przykład:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List<var> list = new List<var>();
list.Add(o);
list.Add(o1);
Inny przykład:
List<var> list = new List<var>();
while (....)
{
....
list.Add(new {Id = x, Name = y});
....
}
c#
.net
generics
anonymous-types
DHornpout
źródło
źródło
new[] { new{ Id = (int?)null, Name = "Foo" }, new { Id = (int?)1, Name = "Foo" }}
Odpowiedzi:
Mógłbyś:
Jest wiele sposobów na skórowanie tego kota, ale w zasadzie wszyscy używają gdzieś wnioskowania typu - co oznacza, że musisz wywoływać metodę ogólną (być może jako metodę rozszerzenia). Innym przykładem może być:
Masz pomysł :)
źródło
Oto odpowiedź.
źródło
string.Join
i interpolacja ciągów, więc nie trzeba używaćforeach
iFormat
.Można to zrobić na wiele sposobów, ale niektóre odpowiedzi tutaj tworzą listę zawierającą elementy śmieci, co wymaga wyczyszczenia listy.
Jeśli szukasz pustej listy typu ogólnego, użyj opcji Wybierz przeciwko liście krotek, aby utworzyć pustą listę. Żadne elementy nie zostaną utworzone.
Oto jeden wiersz, aby utworzyć pustą listę:
Następnie możesz dodać do niego swój typ ogólny:
Alternatywnie możesz zrobić coś takiego jak poniżej, aby utworzyć pustą listę (ale wolę pierwszy przykład, ponieważ możesz go użyć również do zapełnionej kolekcji Tuples):
źródło
Enumerable.Empty<object>().Select(o=>definition).ToList()
Nie do końca, ale można powiedzieć, że
List<object>
wszystko będzie działać. Jednaklist[0].Id
nie zadziała.Będzie to działać w środowisku wykonawczym w C # 4.0
List<dynamic>
, ponieważ oznacza to, że nie uzyskasz IntelliSense.źródło
zgaduję
będzie działać.
Możesz również rozważyć napisanie tego w ten sposób:
źródło
Zwykle używam następujących; głównie dlatego, że „zaczynasz” z pustą listą.
Ostatnio pisałem to w ten sposób:
Zastosowanie metody powtarzania pozwoliłoby również na:
... która daje początkową listę z już dodanym pierwszym elementem.
źródło
Możesz to zrobić w swoim kodzie.
źródło
W najnowszej wersji 4.0 można używać dynamiki jak poniżej
źródło
Sprawdziłem IL na kilka odpowiedzi. Ten kod skutecznie zapewnia pustą listę:
źródło
IEnumerable
, podczas gdy moja wersja powracaList
, dokładnie o co prosi OP.new object[] { }.Select(o => new { Id = default(int), Name = default(string) }).ToList()
Oto moja próba.
Wymyśliłem to, kiedy napisałem coś podobnego do stworzenia Anonimowej listy dla niestandardowego typu.
źródło
Możesz utworzyć listę dynamiczną.
„dynamiczny” jest inicjalizowany przez pierwszą wartość dodaną.
źródło
Zamiast tego:
Możesz to zrobić:
Jeśli jednak spróbujesz zrobić coś takiego w innym zakresie, pojawi się błąd czasu kompilacji, chociaż działa on w czasie wykonywania:
Problem polega na tym, że tylko członkowie Object są dostępni w czasie wykonywania, chociaż intellisense pokaże identyfikator właściwości i nazwę .
W .net 4.0 rozwiązaniem jest użycie słowa kluczowego dynamiczna istead obiektu w powyższym kodzie.
Innym rozwiązaniem jest użycie odbicia, aby uzyskać właściwości
źródło
Oto kolejna metoda tworzenia Listy anonimowych typów, która pozwala zacząć od pustej listy, ale nadal mieć dostęp do IntelliSense.
Jeśli chcesz zachować pierwszy element, po prostu umieść jedną literę w ciągu.
źródło
źródło
To stare pytanie, ale pomyślałem, że wstawię odpowiedź C # 6. Często muszę skonfigurować dane testowe, które można łatwo wprowadzić w kodzie jako listę krotek. Dzięki kilku funkcjom rozszerzenia można mieć ten ładny, kompaktowy format, bez powtarzania nazw dla każdego wpisu.
To daje IEnumerable - jeśli chcesz listę, którą możesz dodać, po prostu dodaj ToList ().
Magia pochodzi z niestandardowego rozszerzenia Dodaj metody krotek, jak opisano na https://stackoverflow.com/a/27455822/4536527 .
}
Jedyne, co mi się nie podoba, to to, że typy są oddzielone od nazw, ale jeśli naprawdę nie chcesz tworzyć nowej klasy, to podejście pozwoli ci mieć czytelne dane.
źródło
Jestem bardzo zaskoczony, że nikt nie sugerował inicjalizacji kolekcji. W ten sposób można dodawać obiekty tylko podczas tworzenia listy, stąd nazwa, jednak wydaje się, że jest to najładniejszy sposób. Nie trzeba tworzyć tablicy, a następnie konwertować jej na listę.
Zawsze możesz użyć
object
zamiast,dynamic
ale starając się zachować to w sposób ogólny, wtedydynamic
ma to większy sens.źródło
Możesz to zrobić w ten sposób:
Wydaje mi się to trochę „hacky”, ale działa - jeśli naprawdę potrzebujesz listy i nie możesz po prostu użyć anonimowej tablicy.
źródło
W drugim przykładzie, w którym musisz zainicjować nowy
List<T>
, jednym z pomysłów jest utworzenie anonimowej listy, a następnie wyczyszczenie jej.Lub jako metoda rozszerzenia powinna być łatwiejsza:
A może nawet krótszy,
źródło
Jeśli używasz C # 7 lub nowszego, możesz użyć typów krotek zamiast typów anonimowych.
źródło
Na podstawie tej odpowiedzi opracowałem dwie metody, które mogłyby wykonać to zadanie:
Możesz użyć metod takich jak
Ta odpowiedź ma podobny pomysł, ale nie widziałam jej, dopóki nie stworzyłem tych metod.
źródło
Spróbuj tego:
źródło
źródło