在两个集合上迭代的单个foreach语句

本文关键字:迭代 单个 foreach 语句 集合 两个 | 更新日期: 2023-09-27 18:14:33

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

我想遍历两者,并且我有很好的代码块,我想对它们执行。然而,有一些细微的差异。如果该值为int?,则需要添加一些代码。

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

在c#中有这样的方法吗

foreach(object o in (ints && strings))
{
    if(o is int)
    {
        // do in specific stuff
    }
    // do all my generic stuff.    
}

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

在两个集合上迭代的单个foreach语句

使用这个特殊的结构,您可以使用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);
}

在我看来,这将保持内容的整洁和可读性。

我认为将通用的东西放在一个公共函数中,然后循环遍历两个集合会更干净。这样你就摆脱了有点奇怪的if int之类的东西。

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

这也可以为您工作:

IEnumerator en1 = ints.GetEnumerator();
IEnumerator en2 = strings.GetEnumerator();
while((en1.MoveNext()) && (en2.MoveNext()))
{
     WhateverActionWithNullableInt((int?)en1.Current);
     WhateverActionWithString((string)en2.Current);
}

是的,你可以这样做:

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.    
}

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

您应该创建一个新列表,它是两个列表的连接:

编辑

        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.    
        }