我有一个有两个对象的类。 例如:
public class Animal
{
public Carnivorous MeatEater { get; set; }
public Herbivorous VegEater { get; set; }
public Animal()
{
this.MeatEater = new Carnivorous();
this.VegEater = new Herbivorous();
}
}
Carnivorous
和Herbivorous
拥有Category
属性。
我使用我的数据库中的数据列表填充此类,该数据列表存储在MeatEater
或VegEater
中。
我需要从Category
和MeatEater
两者中得到VegEater
的明确列表。
我怎样才能得到这个清单?
谢谢!
答案 0 :(得分:2)
如果我正确理解了您的问题,请转到:(假设Category
为string
,否则您还必须在类别类中重载Equals
):
var result = myList.SelectMany(GetValidCategories).Where(s => s != null)
.Distinct();
所需功能:
public static IEnumerable<string> GetValidCategories(Animal a)
{
List<string> categories = new List<string>();
if (a.MeatEater != null) categories.Add(a.MeatEater.Category);
if (a.VegEater != null) categories.Add(a.VegEater.Catergory);
return categories;
}
但是,这不是一个好的设计。动物是肉食和/或食用者。他们没有它们。
更好的设计是:
[Flags] public enum AnimalType { Carnivorous = 1, Herbivorous = 2, Ominovorous = 3 }
public class Animal
{
public AnimalType Type { get; set; }
public string Category { get; set; }
//all the other members that Herbivorous + Carnivorous share,
//so pretty much all of them really.
}
然后,这会容易得多:
var result = myList.Select(a => a.Category).Where(s => s != null).Distinct();
答案 1 :(得分:0)
至少有一种基本方法是首先选择它们,然后选择联合。
using System.Linq;
var query1 = (from animal in myList
select animal.MeatEater.Category).Distinct();
var query2 = (from animal in myList
select animal.VegEater.Category).Distinct();
var result = query1.Union(query2);
答案 2 :(得分:0)
如果该类别尚不存在,您可以将肉食者的所有类别添加到列表中,并将所有类别从食者添加到同一列表中。
var lstCategories = new List<string>();
foreach(string category in animal.MeatEater.Category)
if(!lstCategories.Contains(category))
lstCategories.add(category);
foreach(string category in animal.VegEater.Category)
if(!lstCategories.Contains(category))
lstCategories.add(category);
所以最后lstCategories最后会有一组不同的组合类别。