C# 如何返回第一个非';t null或空

C# 如何返回第一个非';t null或空,c#,.net-3.5,C#,.net 3.5,如果我有5个字符串变量,其中0到5个为null或空,是否有一种简单/快捷的方法返回第一个不是null或空的变量?我正在使用.NET3.5 private static string FirstNonEmptyString(params string[] values) { return values.FirstOrDefault(x => !string.IsNullOrEmpty(x)); } 这样称呼: Console.Writ

如果我有5个字符串变量,其中0到5个为null或空,是否有一种简单/快捷的方法返回第一个不是null或空的变量?我正在使用.NET3.5

    private static string FirstNonEmptyString(params string[] values)
    {
        return values.FirstOrDefault(x => !string.IsNullOrEmpty(x));
    }
这样称呼:

        Console.WriteLine(FirstNonEmptyString(one, two, three, four, five) );

定义扩展方法:

static string Or(this string value, string alternative) {
    return string.IsNullOrEmpty(value) ? alternative : value;
}
现在你可以说:

string result = str1.Or(str2).Or(str3).Or(str4) …

编辑:删除Where(),将谓词放在FirstOrDefault()中,如果字符串位于
IEnumerable中,请使用或:


如果您使用的是.NET3.5,那么使用Linq很容易

string[] strings = new[] {"", "a", "b", ""};

string firstNotNullOrEmpty = 
    strings.Where(s => !String.IsNullOrEmpty(s)).FirstOrDefault();


没有表达式树,没有LINQ滥用,没有模糊的语言功能。同样的运行时性能和一个一年级的CS学生可以知道你在做什么。

如果你有固定数量的变量,我建议使用空合并运算符,因为它似乎是迄今为止最简单的选择

var result = s1 ?? s2 ?? s3 ?? s4 ?? s5 ?? "";


在我看来,如果已经有了一种语言结构,那么就不需要再为它执行单独的函数了。

您不需要Where,可以使用
.FirstOrDefault(x=>!string.IsNullOrEmpty(x))
和可选的
??string.Empty
如果不需要空值。如果第一个、第二个、第三个。。是方法,我希望它们只在第一个返回非空结果之前执行。然后另一个解决方案更好。它们只是字符串变量,可能有字符串值,也可能为空。您可以更新您的问题以指示您使用的.NET版本吗?
首先
有一个覆盖,使
Where
无意义。此外,如果所有字符串都为null,则在此处抛出InvalidOperationException。这太糟糕了。我发现包含Where()使它更可读。为什么它会抛出
invalidoOperationException
?打开LINQPad并尝试以下操作:
(新字符串[]{(字符串)null})。首先(x=>!string.IsNullOrEmpty(x))
您将看到它抛出一个IOE,就像First()在没有匹配结果时所做的那样。如果找不到匹配的结果,FirstOrDefault()永远不会抛出;它只返回
default(T)
。对!您一定错过了我的更新,我将
First()
更改为
FirstOrDefault()
=)。我更改了间距,使其显示在两行上,并且可读性更强。呃。S'kay,但不是lazy-evaluated。如果第一个值不是null或空,则仍将检查除最后一个值之外的所有其他值。四个函数调用,其中一个就足够了。@Robert Davis:Will实际上是对的,他只是用了奇怪的措辞;此版本不使用短路评估,而
FirstOrDefault
方法实际上会在找到第一个元素后停止。不过,如果您只比较5个元素,我就不用担心了。顺便说一句,我使用这样的扩展方法(使用NullOrWhiteSpace,lol 4.0)用于显示目的,而不是返回集合中的第一个非空字符串。我像这样使用它:
string.Format(“显示项{0}”、项.Name.或(“(未给出名称)”)@Jeffrey,@Will:这是真的,我差点就考虑不发了。但说实话,这并不重要,我认为这段代码是最简洁、可读性最好的选择。我会自己用吗?不确定——但主要是因为我反对生成大量虚假的、非通用的扩展方法,而不是因为它可能很慢。还可以考虑,它可能比创建列表/数组更有效,并且迭代它(使用迭代器,它将再次创建)。因此,我仍然不相信性能是反对使用这种方法的原因。对于一年级的CS学生来说,我感到很难过,因为他们没有语言功能,这使得编码成为一种乐趣。@Will:LINQ滥用是影响我们社区的一个严重问题,让我们都参与解决方案,而不是问题。顺便说一句,我喜欢LINQ,上周我刚刚将一个基于XPath的库转换为LINQ到XML,EF是我选择的ORM。其他代码“LINQ滥用”如何?你如何定义它?最后,六行、一个显式循环以及与
false
(ugh!)的比较,怎么会比一行简洁、自解释的查询更好呢?1)这个答案已经给出了2)
如果所有字符串都为null或empty@Will,1)我想我是第一个建议使用first/FirstOrDefault作为Where的明显替代方案的人。2) 在所有字符串都为null/空的情况下,提问者没有指定他想要的行为。这就是为什么我建议两者兼而有之。嗯,我正在回忆关于FOD的事情。我的错。我不相信他在问题中说了任何关于在所有字符串都为空时抛出的内容。你也没有说那个小小的事实
First
投掷是人们通常没有意识到的事情,它最终会咬到他们的屁股。我认为阅读的人看到这一点可能很重要。我建议对FirstOrDefaultNoneEmptyString的名称进行调整(就好像没有非空字符串,你会得到一个空字符串吧?)!有一种语言结构可以精确地完成这项任务,它不只是处理字符串。
string[] strings = new[] {"", "a", "b", ""};

string firstNotNullOrEmpty = 
    strings.Where(s => !String.IsNullOrEmpty(s)).FirstOrDefault();
var found = new[]{first, second, third, fourth, fifth}.FirstOrDefault(x =>!String.IsNullOrEmpty(x));
string selected = null;
foreach(string currStr in strArray)
    if(String.IsNullOrEmpty(currStr)==false)
    {
        selected = currStr;
        break;
    }
var result = s1 ?? s2 ?? s3 ?? s4 ?? s5 ?? "";