更改类的默认值

时间:2011-06-15 22:07:38

标签: c# ienumerable

public class MyClass
{
    public string myString;

    public MyClass(string s)
    {
        this.myString = s;
    }
}

IEnumerable<MyClass>中如何更改FirstOrDefault()方法的默认值 例如,我想返回new MyClass("HelloWorld");

编辑:有没有办法覆盖类的默认值?
MyClass的默认值类似new MyClass("Default");

5 个答案:

答案 0 :(得分:8)

您无法直接更改它。但是你有几个选择。

如果您的序列不包含null,则可以使用:

MyClass result = seq.FirstOrDefault() ?? new MyClass("HelloWorld");

或者您可以实现自己的版本,该版本采用默认值的参数:

    public static T FirstOrDefault<T>(this IEnumerable<T> source, T defaultValue)
    {
        using (IEnumerator<T> enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
                return enumerator.Current;
            else
                return defaultValue;
        }
    }

    public static T FirstOrDefault<T>(this IEnumerable<T> source, Func<T, bool> predicate, T defaultValue)
    {
        using (IEnumerator<T> enumerator = source.Where(predicate).GetEnumerator())
        {
            if (enumerator.MoveNext())
                return enumerator.Current;
            else
                return defaultValue;
        }
    }

您也可以为FirstOrDefault的此实现使用不同的名称,但由于它不会与任何现有的重载发生冲突,因此我使用了相同的名称。

https://github.com/CodesInChaos/ChaosUtil/blob/master/Chaos.Util/LinqExtensions.cs

答案 1 :(得分:6)

作为CodeAsChaos的良好答案的替代品,你也可以做得更短:

public static T MyFirstOrDefault<T>(
    this IEnumerable<T> sequence, 
    T myDefault)
{
    foreach(T item in sequence)
        return item;
    return myDefault;
}

public static T MyFirstOrDefault<T>(
    this IEnumerable<T> sequence, 
    Func<T, bool> predicate, 
    T myDefault)
{
    return sequence.Where(predicate).MyFirstOrDefault(myDefault);
}

答案 2 :(得分:2)

您可以像这样定义一个扩展方法:

public static T FirstOrDefault<T>(this IEnumerable<T> source, T defaultValue)
{
    foreach (T x in source)
    {
        return x;
    }
    return defaultValue;
}

答案 3 :(得分:2)

为什么不只使用DefaultIfEmtpy()

例如:

var result = this.MyClasses
    .Where(c => c.SomeCondition)
    .Select(c => c)
    .DefaultIfEmpty(new DefaultClass())
    .First();

答案 4 :(得分:0)

我将不再使用泛型,只需将其绑定到您的类的可枚举中:

public static MyClass FirstOrDefault(this IEnumerable<MyClass> source)
{
    foreach (var x in source)
    {
        return x;
    }
    return new MyClass("hello world"); 
    //OR, could be made a bit nicer by making a static method in your class
    return MyClass.Default();
}

这将做你想要的,但只适用于你的班级。如果这是可以接受的,那么这是迄今为止最简单,最短的方式。

相关问题