【问题标题】:LINQ How to define a default type for use with ElementAtOrDefault OperatorLINQ 如何定义与 ElementAtOrDefault 运算符一起使用的默认类型
【发布时间】:2009-01-29 11:02:31
【问题描述】:

我非常喜欢这个 ElementAtOrDefaultOperator 用于通用列表的声音,但我不知道如何为我的对象列表定义默认类型。据我了解,如果我有如下对象列表,则默认值将为 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 或其他方法,但我认为它不存在。

有什么想法吗?

【问题讨论】:

    标签: c# linq list


    【解决方案1】:

    只需编写自己的扩展方法:

    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&lt;T&gt; 作为默认值:

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

    【讨论】:

    • 适当的重载可以像在 LINQ 实现中一样返回 default(T)。
    • @sixlettervariables - 但它已经存在于非重载的标准 LINQ 运算符中......
    • 真的很奇怪为什么它还不是框架的一部分。这很简单,但我不想仅仅为了这个重载而将扩展类添加到继承的项目中。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2014-08-06
    • 2017-11-23
    • 2012-10-30
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多