所以我有两个集合 - 一个是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>
的通用列表时,我收到错误
答案 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.
}