更改类的默认值

Nav*_*ani 6 c# ienumerable

public class MyClass
{
    public string myString;

    public MyClass(string s)
    {
        this.myString = s;
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable<MyClass>我怎样可以更改默认值FirstOrDefault()的方法
.例如我要回new MyClass("HelloWorld");

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

Cod*_*aos 9

你不能直接改变它.但是你有一些选择.

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

MyClass result = seq.FirstOrDefault() ?? new MyClass("HelloWorld");
Run Code Online (Sandbox Code Playgroud)

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

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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


Eri*_*ert 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);
}
Run Code Online (Sandbox Code Playgroud)