迭代两个继承类(同一基类)的列表

  • 本文关键字:基类 列表 继承 两个 迭代 c#
  • 更新时间 :
  • 英文 :


我有两个列表。这两个列表的类型继承自相同的基类型。我想对它们进行迭代,并执行只使用基类功能的操作,而不需要一个接一个地进行两个基本相同的foreach循环。

我不能将列表复制到另一个列表或类似的东西,因为我需要在操作完成后分别以原始形式使用列表。

有没有办法做到这一点,而不写一个函数?

class Program
{
    static void Main(string[] args)
    {
        // I have two lists of inherited classes
        List<Babby1> list1 = returnBabby1();
        List<Babby2> list2 = returnBabby2();
        // I want to iterate through both, and do the same thing, which is a part
        // of the base class functionality.
        // Basically I want this to be a single foreach loop.
        foreach (Babby1 item in list1)
            item.var = 50;
        foreach (Babby2 item in list2)
            item.var = 50;
        // I have to send them as separate lists, the type being the original (inherited) class
        sendBabby1(list1);
        sendBabby2(list2);
    }
    static void sendBabby1(List<Babby1> list)
    {
    }
    static void sendBabby2(List<Babby2> list)
    {
    }
    static List<Babby1> returnBabby1()
    {
        return new List<Babby1>();
    }
    static List<Babby2> returnBabby2()
    {
        return new List<Babby2>();
    }
}
class Base
{
    public int var;
}
class Babby1 : Base
{
    public int var1;
}
class Babby2 : Base
{
    public int var2;
}

这应该能奏效…

foreach (var item in list1.Concat<Base>(list2))
{
    // Do your thing
}

编辑:我把Union改为Concat,因为我认为这可能更合适。

只使用基类,像这样:

List<Babby> list = new List<Base>();
list.AddRange(returnBabby1());
list.AddRange(returnBabby2());
foreach (Base item in list)
    item.var = 50;
sendBabby1(list.OfType<Babby1>().ToList());
sendBabby2(list.OfType<Babby2>().ToList());

(当然,这假设您在基类中声明了您设置的变量)

您可以使用IEnumerable<T>的协方差来实现这一点,如果您计划简单地迭代列表而不添加项目或在列表上执行其他操作:

static SendBaby(IEnumerable<Base> list) 
{
  ...
}
...
SendBaby(list1)
SendBaby(list2)

您可以使用for循环,使用Count代替。(如果比较确实消耗额外的CPU周期)

for(int i=0;i<baby1.Count||i<baby2.Count;i++)
{
   if(baby1.Count<i)
      baby1[i].field = 50;
   if(baby2.Count<i)
      baby2[i].field = 50;
}

这个做得很好:

        var babies1 = new List<Baby1>(5);
        for (int i = 0; i < 5; i++)
        {
            babies1.Add(new Baby1 { Name = "Babies1 " + i, Var1 = 1});
        }
        var babies2 = new List<Baby2>(5);
        for (int i = 0; i < 5; i++)
        {
            babies2.Add(new Baby2 { Name = "Babies2 " + i });
        }
        foreach (Baby b in babies1.Union<Baby>(babies2))
        {
            b.Var1 = 50;
        }
        foreach (var baby2 in babies2)
        {
            Console.WriteLine(baby2.Var1);
        }
        foreach (var baby1 in babies1)
        {
            Console.WriteLine(baby1.Var1);
        }

最新更新