C# 有没有更好的方法来编写一个if语句,寻找一个变量来匹配多个变量中的一个?

C# 有没有更好的方法来编写一个if语句,寻找一个变量来匹配多个变量中的一个?,c#,C#,我需要检查一个变量是否有几个不同的值之一。目前我有如下代码: if (cName == "Products" || cName == "Packages" || cName == "Contents" || cName == "Packages") .. if (cName == "Products" || cName == "Packages" || cName == "Contents") .. etc 我觉得它不太干净。有没有更简单的单行检查方法?一些我不必重复cName的代码?是的

我需要检查一个变量是否有几个不同的值之一。目前我有如下代码:

if (cName == "Products" || cName == "Packages" || cName == "Contents" || cName == "Packages") 
..
if (cName == "Products" || cName == "Packages" || cName == "Contents") 
..
etc
我觉得它不太干净。有没有更简单的单行检查方法?一些我不必重复cName的代码?

是的

switch (cName) 
{
    case "Products":
    case "Packages":
    case "Contents": // If cName is one of the above, execute code below
        ... // DO STUFF
        break;
    case "Some-other-value": // if cName is exactly Some-other-value, execute code below
        .. // DO STUFF
        break;
}

(或)可能值得调查

var standardCategories = new [] { "Products", "Packages", "Contents" };
if (standardCategories.Contains(cName) || cName == "Fred") {
    ...
} else if (standardCategories.Contains(cName)) {
    ...
}
请注意,这确实会带来“额外的开销”,f.s.v.o——大多数情况下,这并不重要,但可以为您的决定辩护:)对我来说,我每天都会使用更整洁的代码,从来没有遇到过这种方法的问题,但我也不是一个游戏开发人员

(在这种情况下,我会使用嵌套的if语句,因为谓词似乎可以修改;上面的代码只是一个用法示例。请注意,我使用“Fred”作为“Packages”时,检查了……两次。)

快乐编码。

(或)可能值得研究

var standardCategories = new [] { "Products", "Packages", "Contents" };
if (standardCategories.Contains(cName) || cName == "Fred") {
    ...
} else if (standardCategories.Contains(cName)) {
    ...
}
请注意,这确实会带来“额外的开销”,f.s.v.o——大多数情况下,这并不重要,但可以为您的决定辩护:)对我来说,我每天都会使用更整洁的代码,从来没有遇到过这种方法的问题,但我也不是一个游戏开发人员

(在这种情况下,我会使用嵌套的if语句,因为谓词似乎可以修改;上面的代码只是一个用法示例。请注意,我使用“Fred”作为“Packages”时,检查了……两次。)

快乐编码。

试试看

List<string> myMatchList = new List<string> { "Products", "Packages", "Contents" };
if ( myMatchList.Contains ( cName ) )
List myMatchList=新列表{“产品”、“包装”、“内容”};
if(myMatchList.Contains(cName))
或者“内联版本”(注意它不是内存/CPU效率高的版本)

if((新列表{“产品”、“包装”、“内容”}).Contains(cName))
试试看

List myMatchList=新列表{“产品”、“包装”、“内容”};
if(myMatchList.Contains(cName))
或者“内联版本”(注意它不是内存/CPU效率高的版本)

if((新列表{“产品”、“包装”、“内容”}).Contains(cName))
C#方式被认为是:

或者,或者:

using System.Linq;
..
if( new string[]{ "Products", "Packages", "Contents" }.Any( s => s == cName ) )
..
C#方式被认为是:

或者,或者:

using System.Linq;
..
if( new string[]{ "Products", "Packages", "Contents" }.Any( s => s == cName ) )
..

您还可以看看扩展方法

public static class StringExtensions
{
    public static bool EqualsAny(this string s, params string[] args)
    {
        return args.Contains(s);
    }

}
然后你可以使用这个ike:

string cName = "Products";

if (cName.EqualsAny("Products", "Packages", "Contents", "Packages"))
{
}

您还可以看看扩展方法

public static class StringExtensions
{
    public static bool EqualsAny(this string s, params string[] args)
    {
        return args.Contains(s);
    }

}
然后你可以使用这个ike:

string cName = "Products";

if (cName.EqualsAny("Products", "Packages", "Contents", "Packages"))
{
}

将它们放在一个通用列表中,然后使用Contains(…)方法。除了单个术语之外,我不建议使用switch语句comparisons@Carnotaurus:switch语句有什么问题?对我来说,它看起来是迄今为止最可读的答案,我猜它的性能也一样(可能比一些更好)。我唯一一次使用它作为函数的顶级构造(例如,所有路径都是
return
,后面没有语句)。有趣的是,像语法/布局这样的小东西最终会影响我的[主观]思维:)@MichaelBurr:我觉得switch语句不那么可读,特别是在某些情况下,当其他情况下不涉及休息时。另外,我不喜欢代码中到处都是文字,特别是当“SomeOtherValue”不能代替常量时,例如SomeOtherValue。C#中的Switch语句强制使用混乱和看似糟糕的编码实践。将它们放在一个通用列表中,然后使用Contains(…)方法。除了单个术语,我不建议使用Switch语句comparisons@Carnotaurus:switch语句有什么问题?对我来说,它看起来是迄今为止最可读的答案,我猜它的性能也一样(可能比一些更好)。我唯一一次使用它作为函数的顶级构造(例如,所有路径都是
return
,后面没有语句)。有趣的是,像语法/布局这样的小东西最终会影响我的[主观]思维:)@MichaelBurr:我觉得switch语句不那么可读,特别是在某些情况下,当其他情况下不涉及休息时。另外,我不喜欢代码中到处都是文字,特别是当“SomeOtherValue”不能代替常量时,例如SomeOtherValue。C#中的Switch语句强制使用混乱和看似糟糕的编码实践。我讨厌Switch,但我必须承认这是这篇文章中最干净的代码。我讨厌Switch,但我必须承认这是这篇文章中最干净的代码。