2016-12-28 10 views
1

リストから、見つかった文字列のインデックス番号を取得しようとしています。私は、500の文字列の数値のリストを持っている:リスト内で見つかった文字列のインデックスを入力文字列と同じにする方法

List<string> List = new List<string>(); 

だから私はいくつかに等しいいくつかの入力文字列を持っている場合たとえば、私のリスト内の文字列を存在:

string numbStr = "54"; 

は、今私は同じ文字列のインデックスを見つけたいですインデックスの文字列 "54"のインデックスでは、インデックス53です。したがって、私の入力文字列の値が101未満の場合、私は正しい結果を持っています。入力値が文字列「54」である、と私は、リスト内の同じ文字列「54」を見つけた場合、インデックス値は53で、1 Iは、インデックス、このよう希望しまっ:

int index = List.FindIndex(x => x.StartsWith(numbStr)); 

しかし、私の入力番号がある場合たとえば101より大きい場合、string numbStr = "308";インデックス結果は517、 "500"の行は実際には499です。901などがあります。リスト内のすべての文字列は、文字列名と比較してシフト-1のシーケンスでインデックスに等しくなります。

このような間違った結果の原因がわからない場合は、把握する必要があります。行の下

123 b4 c1 nnn 
124 b4 c1 nnn 
125 b4 c1 nnn 
126 b4 c1 nnn 
+0

"StartsWith"ではなく "Equals"メソッドまたは==を使用して、動作するかどうかを確認してください。これは、「開始」が任意の順序で複数の結果につながる可能性があるため、インデックスが正確でない可能性があるからです。 –

+0

入力リストにどのように入力しますか?そのリストはソートされていますか? –

+0

@Abhilash R Vankayalaこんにちは、下の回答と同じように、私はこのように0を得ました –

答えて

0

あなたが入力として12を渡す場合12123の両方に一致StartsWithを使用している問題を引き起こしている可能性があります:

リストは、私はよく分からない空白は多分ので、このようになります、 例えば。

int index = List.FindIndex(x => x.StartsWith(numbStr)); 

ソリューション:

変更以下と与えるようなコードの行には、してみてください

int index = List.FindIndex(x => x.Split(' ')[0] ==numbStr); 

それとも単に

int index = List.FindIndex(x => x.StartsWith(numbStr+" ")); 

更新:

ちょうどあなたが順序であなたのアイテムを持っている、あなたはこのような何かを行うことができ確実にする。..

int index = List.OrderBy(x=>Convert.ToInt32(x.Split(' ')[0])).ToList() 
       .FindIndex(x => x.Split(' ')[0] ==numbStr); 
+0

こんにちは、このように私は同じ結果0を持っているかのように代わりに使用StartsWith –

+2

@ラード:あなたの文字列に空白がないことは確かですか?質問のサンプル配列データを追加します。 – DarkKnight

+0

@ DarkKnightはい空白があります。とにかくさらに行く方法がわからない質問を編集しました –

0

変数Listlistでなければなりません。それがプロパティまたはメソッドの場合は大文字で始まります。私はハードあなたの状況が原因の書式に理解するために見つけることが

が、私はこれらの3つの仮定控除:文字列として供給される

  1. 数を、常にがリストに記載されています。

  2. あなたのリストは、常に対応するインデックスから(リスト[0] == -1、リスト[1] == 0など)の番号が含まれるように並べられています。

  3. 目的は、指定された数字列がリストの右の位置にあるかどうかを確認することです(リストの単体テスト)。

これらの前提には、文字列を解析して指定された位置を確認するとします。これは、指定された番号ごとにリスト全体を検索する必要がないことを意味します(したがって、はるかに高速です)。

var list = new List<string>() { '1', '2', '3', '4', '5', '6', '7', '8', '9', '10' }; 
string test1s = "1"; 
string test2s = "2"; 
string test3s = "10"; 
string test4s = "11"; 

int test1i = null; 
int test2i = null; 
int test3i = null; 
int test4i = null; 

Int.TryParse(test1s, test1i); 
Int.TryParse(test2s, test2i); 
Int.TryParse(test3s, test3i); 
Int.TryParse(test4s, test4i); 

/* in case you do not want to unit test, 
* you can obviously do something else with the variable here. 
* check on list size is to prevent index out of range exceptions and is optional */ 
Assert.IsTrue(test1i.HasValue && list.Count() > test1i && list[test1i-1] == test1s)); 
Assert.IsTrue(test2.HasValue && list.Count() > test2i && list[test2i-1] == test1s)); 
Assert.IsTrue(test3.HasValue && list.Count() > test3i && list[test3i-1] == test1s)); 
Assert.IsFalse(test4.HasValue && list.Count() > test4i && list[test4i-1] == test1s)); 
関連する問題