LINQ如何定义与ElementAtOrDefault运算符一起使用的默认类型

时间:2009-01-29 11:02:31

标签: c# linq list

我非常喜欢这个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或其他一些方法,但我认为它不存在。

有什么想法吗?

1 个答案:

答案 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 {...});