Można skorzystać z leków generycznych i rodzaj wnioskowania, aby utworzyć listę dla Ciebie:
Rereading pytanie, nadal można wykonać kwerendy LINQ na tablicy:
var someArray = new[]{new { foo = 1 }, new { foo = 2 }, new { foo = 1 }};
someArray.Where(x => x.foo == 1)
Więc jeśli nie modyfikują go (powiedzmy za pośrednictwem standardowych List<T>
operacji jak Add
lub Remove
), to nie ma powodu, aby Konwertuj go na List<T>
.
Zdaję sobie sprawę, że być może nadal będziesz w stanie go przekazać (z jakiegoś powodu) i nadal wykonywać operacje bez znajomości jego anonimowego typu. W takim przypadku mógłby traktować go jako dynamic
i wykonywać operacje w czasie wykonywania, ale stracisz żadnej intellisense/strong pisanie że chcesz normalnie mieć z typem anonimowego:
List<dynamic> someDynamicList = new List<dynamic>() {new { foo = 1 }, new { foo = 2 }, new { foo = 1 }};
someDynamicList.Where(x => x.foo == 1)
ostatnia metoda jak podkreślił Tim Schmelter to dzięki wykorzystaniu CastByExample Jon Skeet, ale rozszerza się przekształcić swoją kolekcję o metodę rozszerzenia:
public static IEnumerable<T> CastByExample<T>(this IEnumerable source, T example)
{
foreach(object entry in source)
yield return (T)entry;
}
public static IEnumerable CreateAnonymousData()
{
return new[]{new { foo = 1 }, new { foo = 2 }, new { foo = 1 }};
}
z wykorzystaniem takich jak:
var anonymousData = CreateAnonymousData();
var typedAnonymousData = anonymousData.CastByExample(new { foo = 1 });
typedAnonymousData.Where(x => x.foo == 1);
ta wykorzystuje fakt, że w ciągu samego zespołu na anonimowe typy deklarowanej o tych samych nazwach parametrów, typów i zamówienie skompilować do tego samego typu.To nie zadziała, jeśli musisz zadzwonić pod numer CreateAnonymousData
spoza bieżącego zespołu i musisz zachować sygnaturę swojego anonimowego typu foo
wszędzie, gdzie go używasz (dodaj/zmień jego sygnaturę, musisz musi zaktualizować to wszędzie, gdzie jesteś użyj go lub będziesz miał zły czas).
Ale myślę, że teraz staje się bardziej jasne, że najlepszym rozwiązaniem jest po prostu zdefiniowanie reprezentacji klasowej swojego anonimowego typu.
Dlaczego masz '' Lista
@TimSchmelter Ponieważ 'AnonymousType' jest typem' obiektu'. Nie ma czegoś takiego jak typ danych "anonimowy". Dobrze? – Johan
Typy anonimowe mają tylko właściwości tylko do odczytu. – Romoku