web-dev-qa-db-ja.com

Listに文字列を含む要素が含まれているか確認し、その要素を取得します

この質問に対する答えを探している間、私はLINQを利用して似たようなものに出くわしましたが、私はそれに慣れていないので、それらを完全に理解することができませんでした。基本的に私がやりたいことはこれです。

  1. リストのいずれかの要素に特定の文字列が含まれているかどうかを確認してください。
  2. もしそうなら、その要素を取得します。

私はどうやってそれをやろうとしているのか正直にはわかりません。私が思いつくことができるのはこれです(もちろん、うまくいきません):

if (myList.Contains(myString))
    string element = myList.ElementAt(myList.IndexOf(myString));

なぜうまくいかないのか:

  • myList.Contains()trueを返しません。リストの要素全体が指定した文字列と一致するかどうかをチェックするからです。
  • myList.IndexOf()は出現を見つけることができません、なぜならそれがまたそうであるように、それは文字列と一致する要素をチェックするからです。

それでも、この問題を解決する方法はわかりませんが、私の質問と同じようにLINQを使用しなければならないと思います。とは言っても、それがここにあてはまるならば、私は彼らの例でLINQの使用を私に説明したいと思います(私が言ったように、私はC#で私の時間でそれに煩わされていません)。事前にありがとう(そしてギャルズ?)。

編集:私は解決策を思い付きました。リストをループし、現在の要素に文字列が含まれているかどうかを確認してから、現在の要素と同じ文字列を設定します。私は思っていますが、これよりも効率的な方法はありますか?

string myString = "bla";
string element = "";

for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Contains(myString))
        element = myList[i];
}
108

ここでLinqを使うことができるはずです:

var matchingvalues = myList
    .Where(stringToCheck => stringToCheck.Contains(myString));

最初に一致した商品を単に返したい場合は、

var match = myList
    .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

if(match != null)
    //Do stuff
158
Dave Bish

基本的な答えは次のとおりです。ループを反復処理し、指定された文字列を含む要素を確認する必要があります。それでは、コードは次のようになります。

foreach(string item in myList)
{
    if(item.Contains(myString))
       return item;
}

同等だが簡潔なコードは次のとおりです。

mylist.Where(x => x.Contains(myString)).FirstOrDefault();

ここで、xは上記のコードの "item"のように振る舞うパラメータです。

23
userda
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}
10
Chris
for (int i = 0; i < myList.Length; i++)
{
    if (myList[i].Contains(myString)) // (you use the Word "contains". either equals or indexof might be appropriate)
    {
        return i;
    }
}

昔ながらのループはほとんどの場合最速です。

7
McKay

あなたの文字列を含む文字列のリストが欲しいならば:

var newList = myList.Where(x => x.Contains(myString)).ToList();

別の選択肢はLinq FirstOrDefaultを使うことです

var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();

Containsメソッドは大文字と小文字を区別することに注意してください。

4

あなたはLinqの FirstOrDefault 拡張メソッドを使うことができます:

string element = myList.FirstOrDefault(s => s.Contains(myString));

これは部分文字列myStringを含む最初の要素を返します。そのような要素が見つからない場合はnullを返します。

必要なのがインデックスだけであれば、List<T>クラスの FindIndex メソッドを使います。

int index = myList.FindIndex(s => s.Contains(myString));

これは部分文字列myStringを含む最初の要素のインデックスを返します。そのような要素が見つからない場合は-1を返します。

2
p.s.w.g

あなたはこのようなものを使用できるはずです、それは私にとってはうまくいきました:

var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));

一致しない場所を探す必要がある場合は、このようなものです。

 var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
1
Goku

あなたが使用することができます

var match=myList.Where(item=>item.Contains("Required String"));
foreach(var i in match)
{
//do something with the matched items
}

LINQには、データの任意のコレクションを "クエリ"する機能があります。データベースクエリ(select、whereなど)のような構文(ここでは文字列のコレクション(リスト))を使用できます。

だから、あなたは「それが与えられた条件を満たすところのリストからアイテムをもらう」のようにやっています

「ラムダ式」を使用している場所の内側

簡単に言うと、ラムダ式は(input parameter => return value)のようになります。

そのため、パラメータ "item"の場合は "item.Contains(" required string ")"を返します。そのため、項目に文字列が含まれている場合はtrueが返され、条件を満たすためリストから選択されます。

1
Nithin Nayagam

ここにはたくさんの良い答えがありますが、私は以下のように Exists を使った簡単なものを使います。

foreach (var setting in FullList)
{
    if(cleanList.Exists(x => x.ProcedureName == setting.ProcedureName)) 
       setting.IsActive = true; // do you business logic here 
    else
       setting.IsActive = false;
    updateList.Add(setting);
}
1
Ali

簡単にするためにこれを使ってください。

foreach(string item in myList)//Iterate through each item.
{
 if(item.Contains("Search Term")//True if the item contains search pattern.
 {
   return item;//Return the matched item.
 }
}

あるいは、forループでこれを行うには、これを使います。

    for (int iterator = 0; iterator < myList.Count; iterator++)
    {
        if (myList[iterator].Contains("String Pattern"))
        {
            return myList[iterator];
        }
    }
1
BlackKnight

私は他の答えでboolオプションを見たことがないので、以下のコードが誰かに役立つことを願っています。

Any()を使うだけ

string myString = "test";
bool exists = myList
             .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();
0
Pawel Czapski