101

在 SQL 中,您可以使用以下语法:

SELECT *
FROM MY_TABLE
WHERE VALUE_1 IN (1, 2, 3)

C#中是否有等价物?IDE 似乎将“in”识别为关键字,但我似乎无法找到任何关于它的信息。

那么,是否可以执行以下操作:

int myValue = 1;
if (myValue in (1, 2, 3))
    // Do something

代替

int myValue = 1;
if (myValue == 1 || myValue == 2 || myValue == 3)
    // Do something
4

14 回答 14

138

如果你想写 .In 那么你可以创建一个允许你这样做的扩展。

static class Extensions
{

    public static bool In<T>(this T item, params T[] items)
    {
        if (items == null)
            throw new ArgumentNullException("items");

        return items.Contains(item);
    }

}


class Program
{

    static void Main()
    {


        int myValue = 1;

        if (myValue.In(1, 2, 3))
            // Do Somthing...

        string ds = "Bob";

        if (ds.In("andy", "joel", "matt")) 
        // Do Someting...
    }
}
于 2010-07-02T11:13:43.803 回答
86

List.Contains()是我认为你在找什么。C#in keywordoperator用途与您在 SQL 中所指的用途完全不同。

有两种方法可以in在 C# 中使用关键字。假设您在 C# 中有一个 string[] 或 List。

        string[] names; //assume there are some names;

        //find all names that start with "a"
        var results = from str in names
                      where str.StartsWith("a")
                      select str;

        //iterate through all names in results and print
        foreach (string name in results)
        {
            Console.WriteLine(name);
        }

参考您的编辑,我会以这种方式放置您的代码来做您需要的事情。

        int myValue = 1;
        List<int> checkValues = new List<int> { 1, 2, 3 };

        if (checkValues.Contains(myValue))
            // Do something 
于 2010-07-02T10:46:02.040 回答
39

你可以这样做:

var x = 99; // searched value

if (new[] {1,2,3,99}.Contains(x))
{
   // do something
}
于 2013-08-30T19:42:08.190 回答
7

你通常使用Contains集合的方法。

myCollection.Where(p => Enumerable.Range(1,3).Contains(p));

我希望它有所帮助。

于 2010-07-02T10:52:45.147 回答
6

C# 中没有“in”运算符,“in”关键字仅与“foreach (... in ...)”或“from ... in ...”一起使用。

您的 SQL 查询的 LINQ 等效项是:

List<int> list = new List<int> { 1, 2, 3 };
var query = from row in my_table
            where list.Contains(row.value1)
            select row;
于 2010-07-02T10:48:20.117 回答
4

重复:LINQ to SQL in 和 not in

select * from table where fieldname in ('val1', 'val2') 

或者

select * from table where fieldname not in (1, 2) 

LINQ to SQL 中的 IN 和 NOT IN 查询的等价物是这样的:

List<string> validValues = new List<string>() { "val1", "val2"}; 
var qry = from item in dataContext.TableName 
          where validValues.Contains(item.FieldName) 
          select item; 

还有这个:

List<int> validValues = new List<int>() { 1, 2}; 
var qry = from item in dataContext.TableName 
          where !validValues.Contains(item.FieldName) 
          select item; 
于 2010-07-02T10:50:37.710 回答
4

我同意实现 In 运算符的最佳方法是使用扩展方法。我做的有点不同:

public static bool In(this string str, string CommaDelimintedStringSet)
{
    string[] Values = CommaDelimintedStringSet.Split(new char[] { ',' });
    foreach (string V in Values)
    {
       if (str == V)
         return true;
    }
    return false;
}

不同之处在于您不必在每个值周围加上引号,只需将整个逗号分隔值集放在一起,这样更容易输入:

bool result = MyString.In("Val1,Val2,Val3");
于 2012-09-24T19:34:19.613 回答
3

你可以写一个扩展。我以前写过一次,用于制作类似的代码

if(someObject.stringPropertyX.Equals("abc") || someObject.stringPropertyX.Equals("def") || ....){
    //do something
    ...
}else{
   //do something other...
   ....
}

更易读的扩展 st one 能够写

if(someObject.stringPropertyX.In("abc", "def",...,"xyz"){
   //do something
   ...
}else{
  //do something other...
  ....
}

这是代码

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

namespace Some.Namespace.Extenders
{
    public static class StringExtender
    {
        /// <summary>
        /// Evaluates whether the String is contained in AT LEAST one of the passed values (i.e. similar to the "in" SQL clause)
        /// </summary>
        /// <param name="thisString"></param>
        /// <param name="values">list of strings used for comparison</param>
        /// <returns><c>true</c> if the string is contained in AT LEAST one of the passed values</returns>
        public static bool In(this String thisString, params string[] values)
        {
            foreach (string val in values)
            {
                if (thisString.Equals(val, StringComparison.InvariantCultureIgnoreCase))
                    return true;
            }

            return false; //no occurence found
        }
    }
}

这是我当时特定的需求,但您可以对其进行调整和修改以匹配更多不同的类型。

于 2010-07-02T11:10:38.677 回答
3

对于 0 到 9 的数字:

"123".Contains(myValue)

对于任何其他东西:

"|1|2|3|".Contains("|" + myValue + "|")
于 2014-02-26T02:57:08.050 回答
2

对于您更新的问题,您还可以使用 switch 语句。

switch (myvalue)
{
   case 1:
   case 2:
   case 3: 
      // your code goes here
  break;
}
于 2010-07-02T11:05:23.960 回答
1

没有在集合中查找值的 in 运算符,而是集合的一个方法,称为Contains.

最可扩展的解决方案是使用 aHashSet作为集合。与在 a 中进行 O(n) 操作相比,检查 a 中的值HashSet接近于 O(1)List操作。这意味着您可以在 a 中打包很多值HashSet并且它仍然很快,而在 a 中查找值List会变得更慢,因为您拥有的值越多。

例子:

var set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);

var result = items.Select(i => set.Contains(i.value));
于 2010-07-02T11:12:38.313 回答
1

常见的,LINQ方式更强大:

var list = new List<string> { "Tomato", "Orange", "Mango"};
var query = from i in my_table
            from v in list
            where i.Name.StartsWith(v)
            select i;
于 2018-09-06T18:18:37.267 回答
0

C# 中的in关键字用于foreach语句和 LINQ 查询表达式。inC# 本身没有与 SQL 运算符等效的功能,但 LINQ 提供了与Contains().

var list = {1, 2, 3}
var filtered = (
    from item in items
    where list.Contains(item)
    select item).ToArray().
于 2010-07-02T11:03:45.730 回答
0

我做这样的事情:

var shippingAddress = checkoutContext.Addresses.Where(a => (new HashSet<AddressType> { AddressType.SHIPPING_ONLY, AddressType.BILLING_AND_SHIPPING }).Contains(a.AddressType) && a.Id == long.Parse(orderDto.ShippingAddressId)).FirstOrDefault();
于 2019-11-12T02:25:09.630 回答