2009-11-09 16 views
18

Jeśli mam zajęcia typu A i B:Tworzenie listy jeden typ obiektu z listy inny przy użyciu LINQ

public class A 
{ 
    public int TotalCount; 
    public string Title; 
} 

public class B 
{ 
    public int Count; 
    public string Title; 
} 

Mam listę wystąpień przypadki A, co jest najbardziej skutecznym sposobem utworzyć i wypełnić listę typu B za pomocą Linq?

+0

Twoje pytanie jest niejasne ... Jaki jest związek między A i B? –

+0

Zasadniczo reprezentują to samo. W moim przypadku A jest klasą generowaną przez Linq do Sql, gdy utworzyłem klasę Linq to Sql i dodałem do niej tabelę. Ponieważ klasa A ma zależności Linq i Linq do Sql, nie chcę udostępniać jej moim aplikacjom, więc tworzę klasę B, która nie ma żadnych zależności. Muszę zapełnić listę wystąpień klasy B z listy instancji klasy A. – Jeremy

Odpowiedz

26
List<B> listB = listA.Select(a => new B() 
    { 
     Count = a.TotalCount, 
     Title = a.Title 
    }).ToList(); 

Czy to samo, co rozwiązanie eduncan z inną składnią. Wybierz ...

+0

Czy istnieje sposób na filtrowanie wartości z listy A, tak, że lista B nie musi zawierać wszystkich elementów na liście A? – user20358

11
var list = 
    from a in TableA 
    select new B { 
    Count = a.TotalCount, 
    Title = a.Title 
    }; 

Jesteś nowy w górę instancją B w klauzuli SELECT i przypisać właściwości przy użyciu właściwości inline funkcję przypisania w C# 3.0.

Zalety odwzorowania w linii pochodzą z odroczonego wykonania instrukcji Linq. Linq zmapuje zmodyfikowaną instrukcję i wykona ją ze swojego IQueryable. Na przykład:

public class ClassA 
{ 
    public int TotalCount;  
    public string Title; 
} 

public class ClassB 
{ 
    public int Count; 
    public string Title; 
} 

public IQueryable<ClassB> FetchAllOfClassB() 
{ 
    var list = 
    from a in TableOfClassA 
    select new ClassB { 
     Count = a.TotalCount, 
     Title = a.Title 
    }; 

    return list.AsQueryable(); 
} 

Technicznie, AsQueryable() jest nieco zbędny. Czasami używam go, aby to punkt, inni mówią, że jest to absolutnie wymagane. Niemniej jednak sam obiekt listy jest IQueryable klasy ClassB.

Następnie możesz zadzwonić pod numer FetchAllOfClassB() i użyć narzędzia IQuerable. Jest całkiem zgrabny i wydajny.

+2

Właśnie napisać coś takiego, ale masz go pod przykryciem! +1 – RCIX

+2

Uwielbiam linq. +1. –

+0

Dzięki chłopakom. Poprawiono również twoje komentarze. :) – eduncan911

0

Hmm, od szczytu głowy (tak prawdopodobnie będzie błędów!):

List<B> = from a in listOfA select new B(a.count, a.title);

może załatwić sprawę.