我有以下代码:
List<object> qIDs = myObject.ExtraData as List<object>; //ExtraData is of type object - Fixed and can't be changed. Old (bad) design.
List<Tuple<string, bool>> itemIds = new List<Tuple<string, bool>>();
foreach (object tuple in qIDs)
{
itemIds.Add((Tuple<string, bool>)tuple);
}
//do something with itemIds
基本上myObject.ExtraData
是object
,它存储元组{string, bool}
的列表。但是为了检索List<Tuple<,>>
我必须向下转发两次:一次到List<object>
并迭代每个元素并将其添加到List<Tuple<string, bool>>
。无论如何要摆脱这个?
背景/元:List<object>
的需求是光荣黑客的一部分,目前是List包含两种不同类型对象的唯一方法 - 元组列表和其他一些结构列表,所以防止使用列表的代码针对列表中的每种类型的对象进行更改。
答案 0 :(得分:3)
IEnumerable.OfType只能用于返回指定Type
的对象。
using System.Linq;
var extra = (IEnumerable) myObject.ExtraData;
var itemIds = extra.OfType<Tuple<string, bool>>();
//do something with itemIds
上述代码的另一个好处是不会浪费内存和另一个列表副本。
答案 1 :(得分:2)
foreach
, OfType
可以为您做第二次演员:
foreach (Tuple<string, bool> tuple in myObject.ExtraData as List<object>)
{
itemIds.Add(tuple);
}