簡體   English   中英

更改類的默認值

[英]Change Default Value of a Class

public class MyClass
{
    public string myString;

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

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

編輯:有沒有辦法覆蓋類的默認值?
MyClass默認值是new MyClass("Default");

你不能直接改變它。 但是你有一些選擇。

如果您的序列不包含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

作為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);
}

為什么不直接使用DefaultIfEmtpy()

例如:

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

你可以像這樣定義一個擴展方法:

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

我將不再使用泛型,只需將其綁定到您的類的可枚舉:

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();
}

這將做你想要的,但只適用於你的班級。 如果這是可以接受的,那么這是迄今為止最簡單,最短的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM