public class MyClass
{
public string myString;
public MyClass(string s)
{
this.myString = s;
}
}
在IEnumerable<MyClass>
中如何更改FirstOrDefault()
方法的默认值
例如,我想返回new MyClass("HelloWorld");
编辑:有没有办法覆盖类的默认值?
与MyClass
的默认值类似new MyClass("Default");
答案 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();
}
这将做你想要的,但只适用于你的班级。如果这是可以接受的,那么这是迄今为止最简单,最短的方式。