Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改类的默认值_C#_Ienumerable - Fatal编程技术网

C# 更改类的默认值

C# 更改类的默认值,c#,ienumerable,C#,Ienumerable,在IEnumerable中,如何更改FirstOrDefault()的默认值method 例如,我想返回newmyclass(“HelloWorld”) 编辑:是否有方法覆盖类的默认值? 类似于MyClass的默认值是newmyclass(“默认”)您不能直接更改它。但你有几个选择 如果序列中不包含nulls,则可以使用: public class MyClass { public string myString; public MyClass(string s) {

IEnumerable
中,如何更改
FirstOrDefault()的默认值
method
例如,我想返回
newmyclass(“HelloWorld”)

编辑:是否有方法覆盖类的默认值?

类似于
MyClass
的默认值是
newmyclass(“默认”)

您不能直接更改它。但你有几个选择

如果序列中不包含
null
s,则可以使用:

public class MyClass
{
    public string myString;

    public MyClass(string s)
    {
        this.myString = s;
    }
}
或者,您可以实现自己的版本,该版本将参数作为默认值:

MyClass result = seq.FirstOrDefault() ?? new MyClass("HelloWorld");
public static T FirstOrDefault(此IEnumerable源代码,T defaultValue)
{
使用(IEnumerator enumerator=source.GetEnumerator())
{
if(枚举数.MoveNext())
返回枚举数.Current;
其他的
返回默认值;
}
}
公共静态T FirstOrDefault(此IEnumerable源、Func谓词、T defaultValue)
{
使用(IEnumerator enumerator=source.Where(谓词).GetEnumerator())
{
if(枚举数.MoveNext())
返回枚举数.Current;
其他的
返回默认值;
}
}
您也可以使用不同的名称来实现
FirstOrDefault
,但由于它不会与任何现有重载冲突,因此我只使用了相同的名称


您可以定义如下扩展方法:

    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;
        }
    }
public static T FirstOrDefault(此IEnumerable源代码,T defaultValue)
{
foreach(源中的tx)
{
返回x;
}
返回默认值;
}

作为CodeAsChaos好答案的等效替代方案,您还可以做一些简短的操作:

public static T FirstOrDefault<T>(this IEnumerable<T> source, T defaultValue)
{
    foreach (T x in source)
    {
        return x;
    }
    return defaultValue;
}
公共静态T MyFirstOrDefault(
这个可数序列,
T我的默认值)
{
foreach(按顺序排列的T项)
退货项目;
返回myDefault;
}
公共静态T MyFirstOrDefault(
这个可数序列,
Func谓词,
T我的默认值)
{
返回序列.Where(谓词).MyFirstOrDefault(myDefault);
}

我将不使用泛型,而是将其绑定到类的可枚举项:

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);
}
公共静态MyClass FirstOrDefault(此IEnumerable源代码)
{
foreach(源中的变量x)
{
返回x;
}
返回新的MyClass(“hello world”);
//或者,在类中创建一个静态方法可以使它变得更好
返回MyClass.Default();
}
这将满足你的需要,但只适用于你的班级。如果这是可以接受的,那么这是迄今为止最简单、最短的方法

为什么不直接使用

例如:

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

默认值的含义是什么?为什么它的名称不是FirstOrNull?因为在不可为null的类型上
Default(T)
不是
null
。例如,
default(int)
0
而不是
null
。我发布的库有一个
FirstOrNull
方法,可用于不可为null的值类型。@Navid值类型的默认值不为null,因此它不被称为
FirstOrNull()
@CodeInChaos:别忘了处理枚举数。@dtb谢谢,我刚刚注意到,当看到你的答案时,使用只运行一次的
foreach
有点奇怪。但是,这会导致代码比我写的要短得多(而且更难出错)。您正在用自己的版本替换标准函数的定义,该版本表现出微妙的不同。我不想维护那个代码。所以请给你的函数起一个不同的名字。编辑:虽然我更喜欢泛型,但这并不是我不喜欢你的答案的原因。@CodeInChaos,但它只适用于
MyClass
,所以还不错。扩展方法甚至可以包含在
MyClass
中,所以我看不出有什么大不了的。其他人在没有否决票的情况下重用了FirstOrDefault(更一般)这个名称。我使用了不同的参数签名来重用它,因此没有改变原始的
FirstOrDefault
扩展方法的含义。您使用了相同的签名,因此将原始实现隐藏在不同的实现后面。因此,在调用站点,人们会认为原始函数被调用,但相反,行为不同的函数被调用。
var result = this.MyClasses
    .Where(c => c.SomeCondition)
    .Select(c => c)
    .DefaultIfEmpty(new DefaultClass())
    .First();