如何获取列表是其他列表(LINQ)的独特选择?

时间:2012-12-20 07:58:59

标签: linq

对这个问题感到抱歉,我无法建立这个句子。这就是我所拥有的,

class Brand{
    int ModelId;
    string name;
}

class Gallery{

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

我有一个Gallery列表。像这样,

IList<Gallery> galleries;

画廊中的每个画廊都有很多品牌。例如,图库中有6个Gallery对象。每个画廊都有品牌。像这样,

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

我想用LINQ获得的是一系列与上述第一品牌不同的品牌(所以即使他们在列表中,我也不会选择福特和沃尔沃)。画廊不必在其列表中包含品牌。所以它可能是空的,如Gallery6。输出应该是,

{Audi, Mercedes, Subaru, Renault}

我不知道如何用LINQ做到这一点。我尝试了SelectMany,但我能用LINQ做的只是简单的(p=>p.Something = (int) something).ToList()。我无法弄明白该怎么做。

2 个答案:

答案 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>中使用的自定义Distinct。如果您需要List<Brand>,请在结尾处致电ToList()

这是IEqualityComparer<Brand> Distinct(或联盟,Intesect,Except等):

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

答案 1 :(得分:3)

这应该有效:

var brands = galleries.Where(x => x.BrandList.Any())
                      .Select(x => x.BrandList.First().Name)
                      .Distinct();

如果您希望结果是Brand对象的集合而不是字符串,则可以执行以下操作:

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