c# - c#中是否有类似SQL IN语句的比较运算符

标签 c# asp.net .net sql

这不是一个具体的问题,而是一个笼统的问题,长期以来一直在我的脑海中

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

例如

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

在 SQL 中很容易写出这样的语句,例如

从状态为 ("Open","Active","Reopen","InActive) 的工单中选择 *

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

有没有人知道像 SQL 这样的简单方法可以在不使用 if else、foreach 循环或 LINQ 等泛型类型的情况下编写这种语句。

我知道有LINQ,但它还是不如sql的IN那么简单

最佳答案

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

关于c# - c#中是否有类似SQL IN语句的比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10071551/

相关文章:

c# - 使用linq使用另一个条件删除一个列表中的元素

c# - 有哪些调试超时的好方法? (C#)

asp.net - 授予网络服务帐户对 ASP.NET Web 应用程序的读/写权限有什么危险?

C# IEnumerable 获取第一条记录

c# - 我的解密密码是 1 个字符

c# - 异步调用时 ILNumerics 内存损坏

c# - 构建管理区域以控制动态网站

asp.net - 如何跟踪 ASP.Net JIT 编译?它非常慢

c# - 在表中的标签上显示数据库值

c# 两种形式之间的事件处理