2009-11-09 8 views
18

Если у меня есть классы типа A и B:Создать список одного типа объекта из списка других с помощью Linq

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

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

У меня есть список экземпляров экземпляров А, что является наиболее эффективным способом создать и заполнить список типа B с помощью Linq?

+0

Ваш вопрос непонятен ... Какая связь между А и В? –

+0

По существу они представляют одно и то же. В моем фактическом случае A - это класс, сгенерированный Linq to Sql, когда я создал класс Linq to Sql и добавил к нему таблицу. Поскольку класс A имеет зависимости Linq и Linq к Sql, я не хочу раскрывать его в своих приложениях, поэтому я создаю класс B, который не имеет зависимостей. Поэтому мне нужно заполнить список экземпляров класса B из списка экземпляров класса A. – Jeremy

ответ

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

Выполняется аналогично решению eduncan с различным синтаксисом. Сделайте свой выбор ..

+0

Есть ли способ фильтровать значения из списка A, а также чтобы listB не нуждался в каждом элементе в списке A? – user20358

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

Вы новый экземпляр B в своем предложении select и назначаете свойства с помощью функции присвоения свойств inline в C# 3.0.

Преимущества сопоставления его встроенной строки - это отсроченное выполнение оператора Linq. Linq отобразит измененный оператор и выполнит его из вашего IQueryable. Например:

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

Технически AsQueryable() является немного излишним. Иногда я использую его, чтобы понять, что это абсолютно необходимо. Тем не менее, сам объект списка является IQueryable классаB.

Затем вы можете позвонить в FetchAllOfClassB() далее по цепочке и использовать IQuerable. Это довольно гладкий и эффективный.

+2

Как-то написать что-то подобное, но у вас есть это! +1 – RCIX

+2

Я люблю linq. +1. –

+0

Чинцы ребята. Повысил ваши комментарии. :) – eduncan911

0

Хм, с верхней части моей головы (так что, вероятно, будет ошибки!):

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

может сделать трюк.