この質問に対する答えを探している間、私はLINQを利用して似たようなものに出くわしましたが、私はそれに慣れていないので、それらを完全に理解することができませんでした。基本的に私がやりたいことはこれです。
私はどうやってそれをやろうとしているのか正直にはわかりません。私が思いつくことができるのはこれです(もちろん、うまくいきません):
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];
}
ここでLinqを使うことができるはずです:
var matchingvalues = myList
.Where(stringToCheck => stringToCheck.Contains(myString));
最初に一致した商品を単に返したい場合は、
var match = myList
.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));
if(match != null)
//Do stuff
基本的な答えは次のとおりです。ループを反復処理し、指定された文字列を含む要素を確認する必要があります。それでは、コードは次のようになります。
foreach(string item in myList)
{
if(item.Contains(myString))
return item;
}
同等だが簡潔なコードは次のとおりです。
mylist.Where(x => x.Contains(myString)).FirstOrDefault();
ここで、xは上記のコードの "item"のように振る舞うパラメータです。
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
//found
}
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;
}
}
昔ながらのループはほとんどの場合最速です。
あなたの文字列を含む文字列のリストが欲しいならば:
var newList = myList.Where(x => x.Contains(myString)).ToList();
別の選択肢はLinq FirstOrDefaultを使うことです
var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();
Contains
メソッドは大文字と小文字を区別することに注意してください。
あなたは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
を返します。
あなたはこのようなものを使用できるはずです、それは私にとってはうまくいきました:
var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));
一致しない場所を探す必要がある場合は、このようなものです。
var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
あなたが使用することができます
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が返され、条件を満たすためリストから選択されます。
ここにはたくさんの良い答えがありますが、私は以下のように 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);
}
簡単にするためにこれを使ってください。
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];
}
}
私は他の答えでboolオプションを見たことがないので、以下のコードが誰かに役立つことを願っています。
Any()
を使うだけ
string myString = "test";
bool exists = myList
.Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();