2

抱歉这个问题,我无法造句。这是我所拥有的,

class Brand{
    int ModelId;
    string name;
}

class Gallery{

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

我有一个画廊列表。像这样,

IList<Gallery> galleries;

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

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()。我不知道该怎么做。

4

2 回答 2

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>for Distinct(或 Union、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();
于 2012-12-20T08:03:36.017 回答
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());
于 2012-12-20T08:04:20.090 回答