代码之家  ›  专栏  ›  技术社区  ›  SpoiledTechie.com

如何使用LINQ Contains(字符串[])而不是Contains(字符串)

  •  82
  • SpoiledTechie.com  · 技术社区  · 16 年前

    我有一个大问题。

    from xx in table
    where xx.uid.ToString().Contains(string[])
    select xx
    

    价值观 string[]

    默认的 .Contains .Contains(string) .

    我需要它来代替: .Contains(string[]) ...

    编辑: 字符串[]

    编辑: uid也是一个数字。这就是它被转换为字符串的原因。

    20 回复  |  直到 13 年前
        1
  •  89
  •   tvanfosson    10 年前

    Peoplson的观点几乎正确,但您需要创建一个 List<string> 从…起 string[] List<int> 如果uid也是 int List<T> 支持 Contains() . 做 uid.ToString().Contains(string[])

    [编辑]

    除非你把它改过来写给我 正如米奇·麦特(Mitch Wheat)所演示的那样,您可以跳过转换步骤。

    [ENDEDIT]

    这是您想要的,如果您不使用扩展方法(除非您已经将潜在的UID集合作为INT,那么只需使用 List<int>()

    var uids = arrayofuids.Select(id => int.Parse(id)).ToList();
    
    var selected = table.Where(t => uids.Contains(t.uid));
    
        2
  •  40
  •   Jason Jackson    15 年前

    如果你真的想复制 ,但对于数组,下面是一个 extension method 和使用示例代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ContainsAnyThingy
    {
        class Program
        {
            static void Main(string[] args)
            {
                string testValue = "123345789";
    
                //will print true
                Console.WriteLine(testValue.ContainsAny("123", "987", "554")); 
    
                //but so will this also print true
                Console.WriteLine(testValue.ContainsAny("1", "987", "554"));
                Console.ReadKey();
    
            }
        }
    
        public static class StringExtensions
        {
            public static bool ContainsAny(this string str, params string[] values)
            {
                if (!string.IsNullOrEmpty(str) || values.Length > 0)
                {
                    foreach (string value in values)
                    {
                        if(str.Contains(value))
                            return true;
                    }
                }
    
                return false;
            }
        }
    }
    
        3
  •  23
  •   Greg    14 年前

    尝试以下方法。

    string input = "someString";
    string[] toSearchFor = GetSearchStrings();
    var containsAll = toSearchFor.All(x => input.Contains(x));
    
        4
  •  16
  •   RJ Lohan    13 年前

    NET4.0中的LINQ为您提供了另一个选项;.Any()方法;

    string[] values = new[] { "1", "2", "3" };
    string data = "some string 1";
    bool containsAny = values.Any(data.Contains);
    
        5
  •  8
  •   JumpingJezza    14 年前

    List<string> uids = new List<string>(){"1", "45", "20", "10"};
    List<user> table = GetDataFromSomewhere();
    
    List<user> newTable = table.Where(xx => uids.Contains(xx.uid)).ToList();
    
        6
  •  3
  •   spoulson    16 年前

    from xx in table
    where stringarray.Contains(xx.uid.ToString())
    select xx
    
        7
  •  2
  •   Mitch Wheat    16 年前

    这是编写扩展方法的一种方法的示例(注意:我不会对非常大的数组使用此方法;另一种数据结构更合适……):

    namespace StringExtensionMethods
    {
        public static class StringExtension
        {
            public static bool Contains(this string[] stringarray, string pat)
            {
                bool result = false;
    
                foreach (string s in stringarray)
                {
                    if (s == pat)
                    {
                        result = true;
                        break;
                    }
                }
    
                return result;
            }
        }
    }
    
        8
  •  2
  •   NinjaNye    11 年前


    我创造了 NinjaNye.SearchExtension

    string[] terms = new[]{"search", "term", "collection"};
    var result = context.Table.Search(terms, x => x.Name);
    

    您还可以搜索多个字符串属性

    var result = context.Table.Search(terms, x => x.Name, p.Description);
    

    RankedSearch 返回 IQueryable<IRanked<T>> 它只包含一个属性,显示搜索词出现的次数:

    //Perform search and rank results by the most hits
    var result = context.Table.RankedSearch(terms, x => x.Name, x.Description)
                         .OrderByDescending(r = r.Hits);
    

    GitHub项目页面上有一个更广泛的指南: https://github.com/ninjanye/SearchExtensions

    希望这对未来的游客有所帮助

        9
  •  2
  •   kravits88 JML    11 年前

    Linq扩展方法。将使用任何IEnumerable对象:

        public static bool ContainsAny<T>(this IEnumerable<T> Collection, IEnumerable<T> Values)
        {
            return Collection.Any(x=> Values.Contains(x));
        }
    

    string[] Array1 = {"1", "2"};
    string[] Array2 = {"2", "4"};
    
    bool Array2ItemsInArray1 = List1.ContainsAny(List2);
    
        10
  •  1
  •   ctrlShiftBryan    16 年前

    我相信你也可以这样做。

    from xx in table
    where (from yy in string[] 
           select yy).Contains(xx.uid.ToString())
    select xx
    
        11
  •  0
  •   justin.m.chase    16 年前

    如果这是真的,你可能想重新思考整个方法,这似乎是一个非常糟糕的主意。您可能应该尝试将Guid与Guid匹配

    Guid id = new Guid(uid);
    var query = from xx in table
                where xx.uid == id
                select xx;
    

    老实说,我无法想象使用“contains”将字符串数组与Guid的内容进行匹配会是一个好主意。首先,Contains()不能保证Guid中的数字顺序,因此可能会匹配多个项。更不用说以这种方式比较guid要比直接比较慢得多。

        12
  •  0
  •   Gorkem Pacaci    16 年前

    string[] search = new string[] { "2", "3" };
    var result = from x in xx where search.Contains(x.uid.ToString()) select x;
    

    LINQ在这里的表现相当出色,并将其转换为良好的SQL语句:

    sp_executesql N'SELECT [t0].[uid]
    FROM [dbo].[xx] AS [t0]
    WHERE (CONVERT(NVarChar,[t0].[uid]))
    IN (@p0, @p1)',N'@p0 nvarchar(1),
    @p1 nvarchar(1)',@p0=N'2',@p1=N'3'
    

        13
  •  0
  •   Brett Ryan    15 年前

    我设法找到了一个解决方案,但不是一个很好的解决方案,因为它需要使用AsEnumerable(),它将返回数据库中的所有结果,幸运的是,我在表中只有1k条记录,所以它不是很明显,但接下来就是了。

    var users = from u in (from u in ctx.Users
                           where u.Mod_Status != "D"
                           select u).AsEnumerable()
                where ar.All(n => u.FullName.IndexOf(n,
                            StringComparison.InvariantCultureIgnoreCase) >= 0)
                select u;
    

    在中执行以下操作

    string[] search = new string[] { "John", "Doe" };
    var users = from u in ctx.Users
                from s in search
               where u.FullName.Contains(s)
              select u;
    

    我想要的是找到所有用户 “搜索”中的元素。我已经试过了 不同方式的数量,所有这些

    var users = from u in ctx.Users select u;
    foreach (string s in search) {
        users = users.Where(u => u.FullName.Contains(s));
    }
    

    此版本仅查找 包含搜索中的最后一个元素 大堆

        14
  •  0
  •   beauXjames    15 年前

    我找到的最佳解决方案是继续在SQL中创建一个表值函数来生成结果,例如:

    CREATE function [dbo].[getMatches](@textStr nvarchar(50)) returns @MatchTbl table(
    Fullname nvarchar(50) null,
    ID nvarchar(50) null
    )
    as begin
    declare @SearchStr nvarchar(50);
    set @SearchStr = '%' + @textStr + '%';
    insert into @MatchTbl 
    select (LName + ', ' + FName + ' ' + MName) AS FullName, ID = ID from employees where LName like @SearchStr;
    return;
    end
    
    GO
    
    select * from dbo.getMatches('j')
    

    Dim db As New NobleLINQ
    Dim LNameSearch As String = txt_searchLName.Text
    Dim hlink As HyperLink
    
    For Each ee In db.getMatches(LNameSearch)
       hlink = New HyperLink With {.Text = ee.Fullname & "<br />", .NavigateUrl = "?ID=" & ee.ID}
       pnl_results.Controls.Add(hlink)
    Next
    

    非常简单,并且在应用程序中真正发挥了SQL和LINQ的功能……当然,您可以生成任何您想要的表值函数,以获得相同的效果!

        15
  •  0
  •   Lucas Cria    14 年前

    让我们想象一个场景 你有两个数据库 您希望从表“A”中选择id与“B”相同的产品

    使用包含的方法将过于复杂,无法执行此操作

    http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#intersect1

    int[]数字=(0,2,4,5,6,8,9); int[]numbersB=(1,3,5,7,8); var=公共数字a.相交(数字b);

        16
  •  0
  •   theRonny    12 年前

    检查此扩展方法:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace ContainsAnyProgram
    {
        class Program
        {
            static void Main(string[] args)
            {
                const string iphoneAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like...";
    
                var majorAgents = new[] { "iPhone", "Android", "iPad" };
                var minorAgents = new[] { "Blackberry", "Windows Phone" };
    
                // true
                Console.WriteLine(iphoneAgent.ContainsAny(majorAgents));
    
                // false
                Console.WriteLine(iphoneAgent.ContainsAny(minorAgents));
                Console.ReadKey();
            }
        }
    
        public static class StringExtensions
        {
            /// <summary>
            /// Replicates Contains but for an array
            /// </summary>
            /// <param name="str">The string.</param>
            /// <param name="values">The values.</param>
            /// <returns></returns>
            public static bool ContainsAny(this string str, params string[] values)
            {
                if (!string.IsNullOrEmpty(str) && values.Length > 0)
                    return values.Any(str.Contains);
    
                return false;
            }
        }
    }
    
        17
  •  0
  •   Littm JessicaParker    12 年前
    from xx in table
    where xx.uid.Split(',').Contains(string value )
    select xx
    
        18
  •  0
  •   spongebob    9 年前

    尝试:

    var stringInput = "test";
    var listOfNames = GetNames();
    var result = from names in listOfNames where names.firstName.Trim().ToLower().Contains(stringInput.Trim().ToLower());
    select names;
    
        19
  •  0
  •   Hari Lakkakula    6 年前
    var SelecetdSteps = Context.FFTrakingSubCriticalSteps
                 .Where(x => x.MeetingId == meetid)
                 .Select(x =>    
             x.StepID  
                 );
    
            var crtiticalsteps = Context.MT_CriticalSteps.Where(x =>x.cropid==FFT.Cropid).Select(x=>new
            {
                StepID= x.crsid,
                x.Name,
                Checked=false
    
            });
    
    
            var quer = from ax in crtiticalsteps
                       where (!SelecetdSteps.Contains(ax.StepID))
                       select ax;
    
        20
  •  0
  •   William Peixoto    4 年前
            string texto = "CALCA 40";
            string[] descpart = texto.Split(' ');
    
            var lst = (from item in db.InvItemsMaster
                       where descpart.All(val => item.itm_desc.Contains(val))
                       select item
                        ).ToList();
            Console.WriteLine("ITM".PadRight(10) + "DESC".PadRight(50)+"EAN".PadRight(14));
            foreach(var i in lst)
            {
               
    
                Console.Write(i.itm_id.ToString().PadRight(10));
                Console.Write(i.itm_desc.ToString().PadRight(50));
                Console.WriteLine(i.itm_ean.ToString().PadRight(14));
    
    
            }
    
            Console.ReadKey();
    
        21
  •  -1
  •   Konrad Viltersten    12 年前
    string[] stringArray = {1,45,20,10};
    from xx in table 
    where stringArray.Contains(xx.uid.ToString()) 
    select xx
    
        22
  •  -2
  •   SteveTurczyn    8 年前
    Dim stringArray() = {"Pink Floyd", "AC/DC"}
    Dim inSQL = From alb In albums Where stringArray.Contains(alb.Field(Of String)("Artiste").ToString())
    Select New With
      {
         .Album = alb.Field(Of String)("Album"),
         .Annee = StrReverse(alb.Field(Of Integer)("Annee").ToString()) 
      }