我非常喜欢这个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 )
Run Code Online (Sandbox Code Playgroud)
所以我希望能够做到以下几点:
ClassA newObject = myObjects.ElementAtOrDefault(3);
Run Code Online (Sandbox Code Playgroud)
并且newObject是我在某处定义的默认类型ClassA.我以为可能有一个SetDefaultElement或其他一些方法,但我认为它不存在.
有什么想法吗?
Mar*_*ell 19
只需编写自己的扩展方法:
static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default)
{
return index >= 0 && index < list.Count ? list[index] : @default;
}
Run Code Online (Sandbox Code Playgroud)
并致电:
var item = myObjects.ElementAtOrDefault(3, defaultItem);
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望懒惰地评估默认值,请使用Func<T>
默认值:
static T ElementAtOrDefault<T>(this IList<T> list, int index,
Func<T> @default)
{
return index >= 0 && index < list.Count ? list[index] : @default();
}
Run Code Online (Sandbox Code Playgroud)
例如,此表单允许您使用预定义的项目(例如,第一个):
var item = myObjects.ElementAtOrDefault(3, myObjects.First);
Run Code Online (Sandbox Code Playgroud)
或更灵活:
var item = myObjects.ElementAtOrDefault(3, () => myObjects[2]);
Run Code Online (Sandbox Code Playgroud)
要么
var item = myObjects.ElementAtOrDefault(3, () => new MyObject {...});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5424 次 |
最近记录: |