我非常喜欢这个ElementAtOrDefaultOperator的声音用于通用列表,但我无法弄清楚如何为我的对象列表定义默认类型。根据我的理解,如果我有一个如下所示的对象列表,则defaultvalue将为null,但我想返回具有适当值的默认对象的自己版本。这就是我的意思:
ClassA {
string fieldA;
string fieldB;
ClassB fieldC;
//constructor
}
List<ClassA> myObjects = new List<ClassA>();
myObjects.Add( //new object )
myObjects.Add( //new object )
所以我希望能够做到以下几点:
ClassA newObject = myObjects.ElementAtOrDefault(3);
让newObject成为我在某处定义的ClassA的默认类型。我以为可能有一个SetDefaultElement或其他一些方法,但我认为它不存在。
有什么想法吗?
答案 0 :(得分:19)
只需编写自己的扩展方法:
static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default)
{
return index >= 0 && index < list.Count ? list[index] : @default;
}
并致电:
var item = myObjects.ElementAtOrDefault(3, defaultItem);
或者,如果您希望懒惰地评估默认值,请使用Func<T>
作为默认值:
static T ElementAtOrDefault<T>(this IList<T> list, int index,
Func<T> @default)
{
return index >= 0 && index < list.Count ? list[index] : @default();
}
例如,此表单允许您使用预定义的项目(例如,第一个):
var item = myObjects.ElementAtOrDefault(3, myObjects.First);
或更灵活:
var item = myObjects.ElementAtOrDefault(3, () => myObjects[2]);
或
var item = myObjects.ElementAtOrDefault(3, () => new MyObject {...});