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");
编辑:有没有办法覆盖类的默认值?
像默认值的MyClass是new MyClass("Default");
你不能直接改变它.但是你有一些选择.
如果您的序列不包含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
作为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)