对这个问题感到抱歉,我无法建立这个句子。这就是我所拥有的,
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()
。我无法弄明白该怎么做。
答案 0 :(得分:4)
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());