【问题标题】:Is there any compare operator in c# like SQL's IN statementc# 中是否有比较运算符,如 SQL IN 语句
【发布时间】:2012-04-09 09:51:20
【问题描述】:

这不是一个具体的问题,而是一个笼统的问题,我一直在想这个问题

我必须检查一个变量是否包含字符串列表中的值

例如

status == "Open" || status =="Active" || status =="Reopen" || status = "InActive" etc..

在 SQL 中,编写这种语句非常容易,例如

select * from ticket where status in ("Open","Active","Reopen","InActive)

我想知道我们在 C# 中没有这么简单的语句吗?

有没有人知道任何简单的方法,比如 SQL 来编写这种语句,而不使用通用类型的 if else 、foreach 循环或 LINQ 等。

我知道有LINQ,但它仍然不像sql的IN那么简单

【问题讨论】:

标签: c# asp.net .net sql


【解决方案1】:
tickets.Where(t => new[] {"Open",
                          "Active",
                          "Reopen",
                          "InActive"}.Any(x => x == t.status))

您也可以使用 Contain 方法代替 Any 方法,但如果您想要实现任何比较逻辑,请使用 Any 方法,而不是默认的相等比较器。

实现扩展以支持 IN 方法:

public static class Extensions
{
    public static bool In<TItem>(this TItem source, Func<TItem, TItem, bool> comparer, IEnumerable<TItem> items)
    {
        return items.Any(item => comparer(source, item));
    }

    public static bool In<TItem, T>(this TItem source, Func<TItem, T> selector, IEnumerable<TItem> items)
    {
        return items.Select(selector).Contains(selector(source));
    }

    public static bool In<T>(this T source, IEnumerable<T> items)
    {
        return items.Contains(source);
    }

    public static bool In<TItem>(this TItem source, Func<TItem, TItem, bool> comparer, params TItem[] items)
    {
        return source.In(comparer, (IEnumerable<TItem>)items);
    }

    public static bool In<TItem, T>(this TItem source, Func<TItem, T> selector, params TItem[] items)
    {
        return source.In(selector, (IEnumerable<TItem>)items);
    }

    public static bool In<T>(this T source, params T[] items)
    {
        return source.In((IEnumerable<T>)items);
    }
}

并像这样使用:

bool b;

b = 7.In(3, 5, 6, 7, 8); // true
b = "hi".In("", "10", "hi", "Hello"); // true
b = "hi".In("", "10", "Hi", "Hello"); // false
b = "hi".In((s1, s2) => string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase), "", "10", "Hi"); // true

var tuples = new List<Tuple<int, string>>();

for (var i = 0; i < 10; i++)
{
    tuples.Add(Tuple.Create(i, ""));
}

var tuple = Tuple.Create(3, "");

b = tuple.In(tup => tup.Item1, tuples); // true

【讨论】:

    【解决方案2】:
    (new [] { "Open", "Active", "Reopen", "InActive" }).Contains(status)
    

    【讨论】:

    • 括号不是必须的。
    • 这给出了编译错误“无法访问私有方法'包含'这里”
    • @ImranRizvi 在代码文件开头添加using System.Linq;
    • @ImranRizvi,所有 Linq 方法都是扩展方法。他们声明与他们扩展的类型分开。 Тo 为特定类型启用扩展,您需要添加命名空间以使编译器检测到确切位置。
    【解决方案3】:

    这对我有用。

    (new List<string>{ "Open", "Active", "Reopen", "InActive" }).Contains("status");
    

    我也喜欢 c# 3.0 为 String 类创建扩展的特性

    public static class StringExtensions
    {
        public static bool In(this string @this, params string[] strings)
        {
            return strings.Contains(@this); 
        }
    }
    

    以后我们可以用最简单的方式使用它

    status.Contains("Open", "Active", "Reopen", "InActive");
    

    如果您必须编写许多这样的语句,这很好。如果我在 2 个或更多文件中为至少 5-10 个语句语句编写旧样式,我更喜欢编写此扩展程序。

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多