106

1つ大きな質問があります。

linq クエリを取得して、単純に次のようにします。

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

配列の値はstring[](1,45,20,10 など) のような数値になります。

のデフォルトは.Containsです.Contains(string)

代わりにこれを行う必要があります: .Contains(string[])...

編集: 1 人のユーザーが の拡張クラスを作成することを提案しましたstring[]。方法を学びたいのですが、正しい方向に私を向けてくれる人はいますか?

編集: uid も数値になります。そのため、文字列に変換されます。

誰か助けて?

4

22 に答える 22

89

spoulsonはほぼ正しいですが、最初List<string>から作成する必要があります。string[]実際にList<int>は、uidもintList<T>をサポートしますContains()。これを行う uid.ToString().Contains(string[])と、文字列としてのuidに、サブ文字列としての配列のすべての値が含まれることを意味します。拡張メソッドを書いたとしても、その意味は間違っているでしょう。

[編集]

Mitch Wheatが示すように、それを変更して作成しない限りstring[]、変換手順をスキップすることができます。

[ENDEDIT]

拡張メソッドを実行しない場合は、次のようにします(intとして潜在的なuidのコレクションが既にある場合を除き、List<int>()代わりに使用します)。これは、よりクリーンなチェーンメソッド構文を使用し、intへの変換を実行して、クエリをより多くのプロバイダーで使用できるようにします。

var uids = arrayofuids.Select(id => int.Parse(id)).ToList();

var selected = table.Where(t => uids.Contains(t.uid));
于 2008-10-12T02:01:14.073 に答える
40

本当にContainsを複製しようとしているが、配列の場合は、拡張メソッドと使用法のサンプルコードを次に示します。

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;
        }
    }
}
于 2008-10-12T16:00:38.077 に答える
23

次のことを試してください。

string input = "someString";
string[] toSearchFor = GetSearchStrings();
var containsAll = toSearchFor.All(x => input.Contains(x));
于 2008-10-12T02:03:25.987 に答える
17

.NET 4.0 の LINQ には別のオプションがあります。.Any() メソッド;

string[] values = new[] { "1", "2", "3" };
string data = "some string 1";
bool containsAny = values.Any(data.Contains);
于 2012-03-14T22:40:46.867 に答える
8

または、すでにリストにデータがあり、他のLinq形式を好む場合:)

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();
于 2011-04-28T03:31:53.450 に答える
3

どうですか:

from xx in table
where stringarray.Contains(xx.uid.ToString())
select xx
于 2008-10-12T01:24:42.120 に答える
2

これは遅い答えですが、それでも役に立つと思いますこの問題を解決するのに役立つNinjaNye.SearchExtension nuget パッケージを
作成しました。

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);

または、検索語が出現した回数を示すプロパティを単純に含む which を実行し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

これが将来の訪問者に役立つことを願っています

于 2014-02-13T09:07:50.043 に答える
2

これは、拡張メソッドを記述する 1 つの方法の例です (注: 非常に大きな配列にはこれを使用しません。別のデータ構造の方が適切です...):

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;
        }
    }
}
于 2008-10-12T01:54:24.057 に答える
1

私はあなたもこのようなことをすることができると信じています。

from xx in table
where (from yy in string[] 
       select yy).Contains(xx.uid.ToString())
select xx
于 2008-10-12T01:59:43.077 に答える
0

私が見つけた最善の解決策は、先に進んで、次のような結果を生成する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')

次に、関数をLINQ.dbmlデザイナーにドラッグし、他のオブジェクトと同じように呼び出します。LINQは、ストアド関数の列も認識しています。私はそれをこのように呼びます::

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の能力を実際に活用しています...もちろん、同じ効果を得るために必要なテーブル値関数を生成することもできます。

于 2010-06-18T18:52:59.743 に答える
0

では、uid が一意の識別子 (Guid) であると正しく想定していますか? これは考えられるシナリオの単なる例ですか、それとも文字列の配列に一致する GUID を本当に見つけようとしていますか?

これが本当なら、このアプローチ全体を本当に再考したいかもしれませんが、これは本当に悪い考えのようです. おそらく、Guid を Guid に一致させようとしているはずです。

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

正直なところ、「contains」を使用して文字列配列を Guid のコンテンツに一致させることが良いアイデアになるシナリオは想像できません。1 つには、Contains() は Guid 内の数字の順序を保証しないため、複数の項目が一致する可能性があります。言うまでもなく、この方法で GUID を比較すると、直接行うよりもはるかに遅くなります。

于 2008-10-12T16:38:52.007 に答える
0

あなたが本当にやりたいことは次のとおりだと思います.2つのデータベースがあり、それらに共通の製品のテーブルがあるシナリオを想像してみてください.IDが「B」と共通するテーブル「A」から製品を選択したいとします.

メソッドを使用するのは複雑すぎてこれを行うことができません。

msdn の例: 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 = commonNumbers numbersA.Intersect (numbersB);

あなたが必要とすることは交差点で簡単に解決されると思います

于 2010-08-04T03:22:02.643 に答える
0

特権ユーザーIDリストにテーブルのその行のIDが含まれていることを確認して、逆に書く必要があります。

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'

基本的に「検索」配列の内容をSQLクエリに埋め込み、SQLで「IN」キーワードを使用してフィルタリングを行います。

于 2009-01-19T05:17:38.043 に答える
0

私はなんとか解決策を見つけることができましたが、DBからすべての結果を返す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));
}

このバージョンは、検索配列の最後の要素を含むもののみを検索します。

于 2009-07-17T09:21:21.017 に答える
0

この拡張メソッドを確認してください:

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;
        }
    }
}
于 2012-08-10T13:55:19.457 に答える
0
from xx in table
where xx.uid.Split(',').Contains(string value )
select xx
于 2012-07-30T07:02:35.737 に答える
-1
string[] stringArray = {1,45,20,10};
from xx in table 
where stringArray.Contains(xx.uid.ToString()) 
select xx
于 2010-08-31T17:48:41.557 に答える
-2
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()) 
  }
于 2016-10-16T18:21:00.393 に答える