0

我有一个类,其中有两个对象。例如:

public class Animal
{
    public Carnivorous MeatEater { get; set; }
    public Herbivorous VegEater { get; set; }
    public Animal()
    {           
        this.MeatEater = new Carnivorous();
        this.VegEater = new Herbivorous();
    }
}

CarnivorousHerbivorous拥有Category财产。

MeatEater我用我的数据库中存储在或中的数据列表填充了这个类VegEater。我需要Category从两者中获得一个不同的列表MeatEaterVegEater组合。我怎样才能得到这个清单?

谢谢!

4

3 回答 3

2

如果我正确理解了您的问题,那么您就可以了:(假设Category是 a 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();
于 2013-07-17T15:34:01.737 回答
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 最后会有一组不同的组合类别。

于 2013-07-17T15:58:41.030 回答
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);
于 2013-07-17T15:36:58.993 回答