2012-12-20 1 views
2

죄송합니다. 나는 그 문장을 만들 수 없습니다. 여기에 내가 가지고있는 것이있다.다른 목록 (LINQ)을 구별하는 목록을 가져 오는 방법은 무엇입니까?

class Brand{ 
    int ModelId; 
    string name; 
} 

class Gallery{ 

    IList<Brand> brands; 
    ... 
    public BrandList{ 
     get{ return brands; } 
    } 
} 

나는 갤러리 목록을 가지고있다. 이처럼,

IList<Gallery> galleries; 

갤러리가있는 각 갤러리에는 많은 브랜드가 있습니다. 예를 들어, 갤러리에는 6 개의 갤러리 오브젝트가 있습니다. 그리고 각 갤러리에는 Brands가 있습니다. 이와 같이 내가 LINQ와 함께 얻으려고 노력하고 무엇

Gallery1.Brandlist => Audi, Ford 
Gallery2.BrandList => Mercedes,Volvo 
Gallery3.BrandList => Subaru 
Gallery4.BrandList => Renault 
Gallery5.BrandList => Subaru 
Gallery6.BrandList => 

위의 첫 번째 브랜드 만 (그래서 심지어 그들이 목록에있는 포드와 볼보를하지 않습니다)의 모든 별개 브랜드의 목록입니다. 갤러리는 자신의 목록에 브랜드가있을 필요는 없습니다. 갤러리 6처럼 비어있을 수도 있습니다. 출력은 내가 LINQ이 할 수있는 방법을

{Audi, Mercedes, Subaru, Renault} 

를 모르는이어야한다. SelectMany을 시도했지만 LINQ로 할 수있는 것은 모두 간단합니다. (p=>p.Something = (int) something).ToList(). 나는 그것을하는 방법을 알아낼 수 없었다.

+0

의미 : _ "위의 모든 첫 번째 브랜드 만 표시"_? –

+0

각 갤러리의 BrandList의 첫 번째 브랜드 – Ada

+0

이제 알 겠어, 내 대답을 편집 할게. –

답변

4

사용 SelectManyDistinct :

IEnumerable<string> allUniqueBrands = allGalleries 
    .SelectMany(g => g.BrandList.Select(b => b.Name)).Distinct(); 

쿼리 구문에서 :

IEnumerable<string> allBrands = from gallery in allGalleries 
           from brand in gallery.BrandList 
           select brand.Name; 
IEnumerable<string> allUniqueBrands = allBrands.Distinct(); 

편집 : 이제 내가 그것을 가지고, 각의 첫 번째 브랜드가 필요합니다 BrandList.

Brand을 선택하려면 에서 사용할 수있는 사용자 정의 IEqualityComparer<Brand>을 제공해야합니다. List<Brand>을 작성한 경우 끝에 ToList()으로 문의하십시오. 브랜드

public class BrandComparer : IEqualityComparer<Brand> 
{ 
    public bool Equals(Brand x, Brand y) 
    { 
     if (x == null || y == null) return false; 
     return x.Name.Equals(y.Name, StringComparison.OrdinalIgnoreCase); 
    } 

    public int GetHashCode(Brand obj) 
    { 
     if (obj == null) return int.MinValue; 
     return obj.Name.GetHashCode(); 
    } 
} 

여기에 (처음으로)의 별개의 목록입니다 :이 일을해야

List<Brand> uniqueFirstBrands = allGalleries 
    .Where(g => g.BrandList != null && g.BrandList.Any()) 
    .Select(g => g.BrandList.First()) 
    .Distinct(new BrandComparer()) 
    .ToList(); 
+0

포드와 볼보는 갖지 않을 것입니다.IEnumerable을 IList로 변경하고 으로 변경할 수 있습니까? – Ada

+0

'Brand'를 선택하려면'Distinct'에서 사용할 수있는 커스텀'IEqualityComparer '을 제공해야합니다. 'List ''ToList()'를 마지막으로 호출하면 마지막으로. @ RaphaëlAlthaus : 나는 질문을 다시 읽은 후에 내가 무슨 뜻인지 확신 할 수 없다. 하지만 어쩌면 내가 요구 사항을 잘못 이해 했는지도 모른다. –

+0

@Ada : 그에 따라 내 답변을 수정했습니다. –

3

:

여기 Distinct에 대한 IEqualityComparer<Brand> (또는 연합, Intesect, 제외 등)

브랜드 개체 모음 인 문자열 대신에 다음을 수행 할 수 있습니다.

var brands = galleries.Where(x => x.BrandList.Any()) 
         .GroupBy(x => x.BrandList.First().Name) 
         .Select(g => g.First().BrandList.First()); 
+0

지금 바로 사용해 보겠습니다. – Ada

+0

@Ada : 죄송합니다. 이름 속성을 선택하는 것을 잊었습니다. 내 수정 확인;) – digEmAll

+0

이제 BrandId 개체에 ModelId가 없다는 것을 알았습니다. ModelId는 또한 브랜드 목록입니다. (다른 선택을 지금 추가해야 할 것 같습니까? – Ada

관련 문제