这不是一个特定的问题,而是一个长期存在于我脑海中的一般性问题
我必须检查一个变量,如果它包含字符串列表中的值
例如。
status == "Open" || status =="Active" || status =="Reopen" || status = "InActive" etc..
在SQL中,编写这种语句非常容易,例如
从票证中选择*,其中状态为(“打开”,“活动”,“重新打开”,“活动”
我想我们在C#中没有这么简单的陈述?
有人知道像SQL这样的简单方法来编写这种语句,而不使用if else,foreach循环或LINQ等泛型类型。
我知道LINQ就在那里,但它仍然不像sql的IN那么简单
答案 0 :(得分:8)
tickets.Where(t => new[] {"Open",
"Active",
"Reopen",
"InActive"}.Any(x => x == t.status))
您也可以使用Contain方法而不是Any方法,但如果您要实现任何比较逻辑,则使用Any方法,而不是使用默认的相等比较器。
OR
实现扩展以支持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
答案 1 :(得分:6)
(new [] { "Open", "Active", "Reopen", "InActive" }).Contains(status)
答案 2 :(得分:0)
这适合我。
(new List<string>{ "Open", "Active", "Reopen", "InActive" }).Contains("status");
我也喜欢为String class
创建扩展的c#3.0功能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语句语句编写旧样式的话。