在两个集合上迭代的单个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>
的通用列表时,我得到一个错误
使用这个特殊的结构,您可以使用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.
}