2009-11-09 7 views
18

을 사용하여 다른 목록에서 하나 개의 객체 유형의 목록을 작성 : 나는 경우 A는 인스턴스의 목록을Linq에

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

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

을, 가장 효율적인 방식은 무엇인가 Linq를 사용하여 B 유형의 목록을 만들고 채 웁니까?

+0

당신의 질문은 명확하지 않다. A와 B의 관계는 무엇인가? –

+0

그들은 본질적으로 같은 것을 나타냅니다. 내 실제의 경우, A는 Linq to Sql 클래스를 생성하고 테이블을 추가 할 때 Linq가 Sql로 생성 한 클래스입니다. 클래스 A는 Linq와 Linq to Sql 종속성을 가지므로 내 응용 프로그램에 노출시키지 않으므로 의존성이없는 클래스 B를 만듭니다. 그래서 클래스 A 인스턴스 목록에서 클래스 B 인스턴스 목록을 채워야합니다. – Jeremy

답변

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

다른 구문 eduncan의 솔루션과 동일합니까. 당신의 선택을 가져 가라.

+0

listA에서 값을 필터링하여 listA에 listA에있는 모든 항목을 가질 필요가없는 방법이 있습니까? – user20358

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

select 절에 B 인스턴스를 새로 작성하고 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()은 약간 중복입니다. 때로는 그것을 강조하기 위해 사용하고, 다른 사람들은 절대적으로 필요하다고 말합니다. None보다 작 으면 목록 객체 자체가 ClassB의 IQueryable입니다.

그런 다음 FetchAllOfClassB()을 호출하여 IQuerable을 사용할 수 있습니다. 꽤 매끄럽고 효율적입니다.

+2

막 이런 식으로 쓰려고하는데, 덮어 버렸습니다! +1 – RCIX

+2

나는 linq을 좋아합니다. +1. –

+0

얘들 아. 귀하의 의견도 올렸습니다. :) – eduncan911

0

흠, 내 머리 위로 떨어져 (그래서 아마 오류가있을 것입니다!) :

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

트릭을 할 수 있습니다.