2016-09-28 9 views
3

C#と.NET Framework 4.6.1でWPFを開発しています。私はこのコード行を使用していたで始まる文字列のインデックスを見つける

codesRead.IndexOf(string.Format("{0} OK", lastCode)); 

codesReadprivate readonly ObservableCollection<string>です。

これらの文字列を使用していたとき、非常にうまく動作していました。"code1 OK"

これで文字列を変更しました"code1 OK - 23.0005 ms"これは常に-1を返します。

"code1 OK"で始まる文字列のインデックスはどのようにして見つけることができますか?

答えて

3

Find句を使用して要素を取得し、IndexOfで検索することができます。ここではこれを説明するための小さなコンソールアプリケーションです:

List<string> asd = new List<string> 
    { "code5 OK - 234", "code2 OK - 234", "code1 OK - 234", "code4 FAIL - 234" }; 

int index = asd.IndexOf(asd.Find(x => x.StartsWith("code1"))); 

Console.WriteLine(index); 

要素が

EDIT存在しない場合には-1を返します。申し訳ありませんが、私は明らかに十分正確にあなたの記事を読んでいないが。 ObservableCollectionを使用している場合は、FirstOrDefaultを使用して商品を検索することをおすすめします。

ObservableCollection<string> qwe = new ObservableCollection<string>() 
    { "code5 OK - 234", "code2 OK - 234", "code7 OK - 234" }; 

int index = qwe.IndexOf(qwe.FirstOrDefault(x => x.StartsWith("code1"))); 

Console.WriteLine(index); 
+1

@Default Lolありがとう、私は 'Where'で最初にそれを試したが、' Find'でそれをすることにしたが、どういうわけか私の脳は私の指に従わなかった...リマインダーありがとう。私はそれを変更しました –

+0

'ObservableCollection'がFindを持たない(または私が追加しなければならないDLLがないので)' Where'を使用しなければなりませんでした。 – VansFannel

+0

@VansFannel申し訳ありませんが、私は十分に慎重に読んでいませんでした。 'FirstOrDefault'を使うと' List'の 'Find'と同じ結果になります。私はこのメソッドがObservableCollectionにないことを常に忘れています。私の編集を参照してください –

0

は、あなたが最初にしたい要素(複数可)を検索項目にインデックスを投影し、最終的にthosesインデックスを取得することができます:ここでは否定的な結果との例があります。

var result = 
    source 
    .Select ((item, index) => new { item, index }) 
    .Where (tmp => tmp.item.StartsWith ("theStart")) 
    .Select (tmp => tmp.index); // if you just want the indexes 

必要に応じて、First[OrDefault]またはSingle[OrDefault]Whereを置き換えることができます。
あなたは価値の興味がない、ただインデックス場合は、直接最初Select

var result = 
    source 
    .Select (item, index) => new { index, isValid = item.StartsWith ("theStart") }) 
    .Where (tmp => tmp.isValid) 
    .Select (tmp => tmp.index); 
StartsWith/ IndexOfを行うことができます0

IndexOfと平等のためのテストでStartsWithを置き換えることができます

関連する問題