使用if / else条件处理多个列表 - 递归

时间:2014-07-29 09:08:15

标签: c# recursion

我有很多包含一个或多个对象的列表,如果列表中有多个对象,它应该做一些事情。当列表中只有一个对象时,请取第二个列表并执行相同操作。这应该发生在4个列表中。 这是我的解决方案,但我认为这是一个糟糕的解决方案。处理此代码有更好的方法吗?

if (list1.Count > 1)
    for (int i = 0; i < list1.Count; i++)
    {
        DoSomething(list1);
    }
else
{
    if (list2.Count > 1)
        for (int i = 0; i < list2.Count; i++)
        {
            DoSomething(list2);
        }
    else
    {
        if (list3.Count > 1)
            for (int i = 0; i < list3.Count; i++)
            {
                DoSomething(list3);
            }
        else
        {
        ...

非常感谢和最诚挚的问候, 约尔格

4 个答案:

答案 0 :(得分:6)

// using System.Collections.Generic;
// using System.Linq;

// create an enumerable "list" of your lists (however many there are):
var lists = new[] { list1, list2, list3, … };

// find the first list that has more than 1 element:
var list = lists.FirstOrDefault(_ => _.Count() > 1);

// if there is such a list…
if (list != null)
{
    // … then `DoSomething` to each of its items:
    foreach (var item in list)
    {
        DoSomething(item);
    }
}

答案 1 :(得分:1)

我尝试使用与OP相同的伪代码样式。逻辑复制了原始文件,但是采用了浓缩形式,并且可以轻松地将列表添加到主列表数组中(如@Benjamin所建议的那样)。

假设DoSomething是应用于第一个列表的单个函数,其具有Count&gt; 1.如果要为每个列表应用自定义函数,可以创建另一个数组来保存函数以调用相应的列表。

listArray = new[] {list1, list2, list3, list4}; // you can add more as needed to this master array

for (int i = 0; i < listArray.Count; i++)
{
     if (listArray[i].Count > 1)
     {
         for (int i = 0; i < listArray.Count; i++)
         {
             DoSomething(listArray[i]); 
         }

         break; // http://msdn.microsoft.com/en-us/library/adbctzc4.aspx
     }
}

答案 2 :(得分:0)

您可以先检查您要使用的列表:

var lists = new[]{ list1, list2, list3, list4 };
var list = lists.FirstOrDefault(l => l.Count > 1);
if(list != null)
{
     list.ForEach(l => DoSomething(list));
}

答案 3 :(得分:0)

好像你需要第一个列表,其中Count&gt; 1。 此外,在for循环中,您要说DoSomething(list1);。我认为它应该是DoSomething(list1 [i]);

var lists = new [] { list1, list2, list3, list4 };
var target = lists.FirstOrDefault(l => l.Count() > 1);
if (target != null) {
    for (int i = 0; i < target.Count; i++)
    {
        DoSomething(target[i]);
    }
} else {
    //...
}