C#中的多个字符串比较

36

假如我需要比较字符串x是否为"A"、"B"或"C"。

使用Python,我可以使用in运算符轻松检查这个条件。

if x in ["A","B","C"]:
    do something

使用C#,我可以做到

if (String.Compare(x, "A", StringComparison.OrdinalIgnoreCase) || ...)
    do something

它是否可以更像Python?

添加的内容

我需要添加System.Linq以便使用不区分大小写的Contain()。

using System;
using System.Linq;
using System.Collections.Generic;

class Hello {
    public static void Main() {
        var x = "A";

        var strings = new List<string> {"a", "B", "C"};
        if (strings.Contains(x, StringComparer.OrdinalIgnoreCase)) {
            Console.WriteLine("hello");
        }
    }
}
或者
using System;
using System.Linq;
using System.Collections.Generic;

static class Hello {
    public static bool In(this string source, params string[] list)
    {
        if (null == source) throw new ArgumentNullException("source");
        return list.Contains(source, StringComparer.OrdinalIgnoreCase);
    }

    public static void Main() {
        string x = "A";

        if (x.In("a", "B", "C")) {
            Console.WriteLine("hello");
        }
    }
}
8个回答

45

使用Enumerable.Contains<T>方法,它是IEnumerable<T>的扩展方法:

var strings = new List<string> { "A", "B", "C" };
string x = // some string
bool contains = strings.Contains(x, StringComparer.OrdinalIgnoreCase);
if(contains) {
    // do something
}

42
if ((new[]{"A","B","C"}).Contains(x, StringComparer.OrdinalIgnoreCase))

这是一个漂亮的一行代码。 :D - DevOpsSauce
Trully是一个非常优美的解决方案! - myroslav
在VS 2019中无法编译。它认为那是一个没有定义Contains的string[]。如果转换为IList,它就可以工作了。 - stonedauwg

14
在Stack Overflow上有一个经典的帖子在这里,里面有一个扩展方法可以完全满足你的需求。
public static bool In<T>(this T source, params T[] list)
{
  if(null==source) throw new ArgumentNullException("source");
  return list.Contains(source);
}

回应下面的评论,如果你只关心字符串的话:
public static bool In(this string source, params string[] list)
{
    if (null == source) throw new ArgumentNullException("source");
    return list.Contains(source, StringComparer.OrdinalIgnoreCase);
}

这导致了你熟悉的语法:
if(x.In("A","B","C"))
{
  // do something....
}

注意,这基本上和其他人发布的内容几乎完全相同,只是语法上更接近你提到的方式。

除了聪明,你的答案是最干净易读的。C#不必像LISP语言一样充斥着令人烦恼的多余括号。(是的,我知道LISP的强大和“规律性”,但是这只是一个“a在a、b、c中吗?”的情况。) - zurcacielos

4
List<string> possibleMatches = new List<string>{"A", "B", "C"};
if (possibleMatches.Contains(inputString))
{
  // do something
}

3
当然。
var lst = new List<string>() { "A", "B", "C" };
if (lst.Contains(x, StringComparer.OrdinalIgnoreCase) {
   // do something
}

1

现在C# 9.0拥有模式匹配,有了一种新的优雅方式来实现这个目标:

if (x is "A" or "B" or "C") { ... }

或者,如果您需要不区分大小写:

if (x.ToUpperInvariant() is "A" or "B" or "C") { ... }

0

可能你最好的选择是使用C#中的switch语句

编辑:抱歉,Select Case是VB.NET(我通常使用的语言),在C#中应该使用switch语句。


我使用了 C# 命令进行了更新。没有意识到 Select Case 只限于 VB.NET。 - Frazell Thomas
2
你使用什么标准来判断何时使用 switch(或 select)是“最佳”的? - Cos Callis

-2

有几种方法可以实现这个,我建议你这样做:

 private const string _searched = "A|B|C|";
 private void button1_Click(object sender, EventArgs e)
 {
     string search = "B" + "|";
     if (_searched.IndexOf(search) > -1)
     {
         //do something
     }
 }

有很多其他的方法来处理这个问题,而且你的搜索范围越大,使用数组、哈希表或集合就越有价值。只要你的可能性范围保持较小,使用简单的字符串将是最佳性能。更复杂的数组或对象(或对象数组...)的所有开销都是不必要的。


请问那位匿名的负面评价者能站出来并且公开表态吗? - Cos Callis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接