一个foreach语句,它迭代两个集合

时间:2014-07-24 15:27:42

标签: c# collections

所以我有两个集合 - 一个是int?,另一个是string

我想迭代这两个,我有一大堆代码,我想对每个代码执行。但是有一些细微的差别。如果值为int?,则需要一些额外的代码。

我试图遵循DRY原则,因此我不想重写我的代码。我也不想把它放在一个外部函数中,因为它已经从我的MVC app控制器代码中抽象出来了,我不希望它变得不必要的复杂。

有没有办法在c#

中做这样的事情
foreach(object o in (ints && strings))
{
    if(o is int)
    {
        // do in specific stuff
    }

    // do all my generic stuff.    
}

编辑: 实际上int?不是int。当我尝试将它们组合成类型List<object>的通用列表时,我收到错误

5 个答案:

答案 0 :(得分:3)

使用此特定结构,您可以使用Concat将它们组合成一个大对象集合,例如:

foreach (object o in ints.Cast<object>().Concat(strings.Cast<object>()))

但我可能会建议将您的功能分解为方法,并运行两个循环:

foreach (int i in ints) {
    DoSomething(i);
    DoSomethingWithInt(i);
}

foreach (string s in strings) {
    DoSomething(s);
    DoSomethingWithString(s);
}

在我看来,这将使事情变得清洁,更具可读性。

答案 1 :(得分:1)

我认为将通用内容放在一个通用函数中然后遍历两个集合会更清晰。这样你就可以摆脱有些奇怪的问题。

foreach(int number in ints)
{
    // do int specific stuff    
    GeneralFunction(number);
}

foreach(string stringValue in strings)
{
    GeneralFunction(number);
} 

答案 2 :(得分:1)

这也适用于你:

IEnumerator en1 = ints.GetEnumerator();
IEnumerator en2 = strings.GetEnumerator();

while((en1.MoveNext()) && (en2.MoveNext()))
{
     WhateverActionWithNullableInt((int?)en1.Current);
     WhateverActionWithString((string)en2.Current);
}

答案 3 :(得分:0)

是的,你可以这样做:

List<int> ints = new List<int>();
List<string> strings = new List<string>();
foreach (object o in ints.Cast<object>().Concat(strings))
{
    if (o is int)
    {
        // do in specific stuff
    }

    // do all my generic stuff.    
}

我会把它分成函数并利用自己的重载,但你说你不想这样做。

答案 4 :(得分:0)

您应该创建一个新列表,这是两个列表的串联:

修改

        List<object> list = new List<object>();
        List<int> ints = new List<int>(); ints.Add(74); ints.Add(47);
        List<string> strings = new List<string>(); strings.Add("hello"); strings.Add("hello2");
        list.AddRange(ints.Cast<object>());
        list.AddRange(strings.Cast<object>());

        foreach (object o in list)
        {
            Trace.WriteLine(o);
            if (o is int)
            {
                // do in specific stuff
            }

            // do all my generic stuff.    
        }