我正在使用通用数据结构,比如MyGeneric<Type>
。
有一种情况我必须迭代它所拥有的所有值
我正在尝试的代码。
for ( all the keys in myGeneric ) {
// do lot of stuff here
}
现在泛型可以将基类型保存为double和string,它也可以保存一些用户定义的类型。 在某种特殊情况下,我必须根据通用类型进行一些特定的工作。
所以最终的代码块看起来像这样
for( all the keys in myGeneric ) {
if key is type foo then
//do foo foo
else if key is of type bar
//do bar bar
}
现在,由于我对复杂性敏感,所以我不喜欢在for循环中使用if条件。 所以我做的下一个解决方案是
if myGeneric is of type foo
call fooIterator(myGeneric)
if myGenric is of type bar
call barItetrator(myGeneric)
function FooIterator() {
// .....
// foo work
//......
}
function BarItetrator() {
// .....
// bar work
//......
}
然后当有人看到我的代码时,我很确定他们会喊“重构”在哪里。
在这种情况下,理想的做法是什么?
感谢。
答案 0 :(得分:7)
那么,您可以使用Linq OfType<T>
方法和多个循环吗?
foreach(Foo foo in list.OfType<Foo>()) {
//
}
foreach(Bar bar in list.OfType<Bar>()) {
//
}
除此之外,你还有条件陈述。我确实看过这个关于F#的here,它更干净地做到这一点。
撇开;如果这是使用PushLINQ(在MiscUtil中),你可以在一次迭代中通过不同的分支推送不同的类型来做到这一点 - 不确定它是否仅仅为此保证。
答案 1 :(得分:0)
我认为你的第二个选项看起来好一点。特别是如果foo / bar工作包含很多代码。在性能方面,我预计在调用方法时会有轻微的损失,但我认为它不会影响你。