我试图从列表中获取已创建字符串的索引号。我有500个字符串数值的列表:
List<string> List = new List<string>();
所以如果我的列表中有一些输入字符串等于某个存在的字符串,例如:
string numbStr = "54";
现在我希望在列表中找到相等字符串的索引,字符串的索引&#34; 54&#34;这应该是索引53.所以如果我的输入字符串值小于101我有正确的结果。如果输入值是一个字符串&#34; 54&#34;,我发现相等的字符串&#34; 54&#34;在列表中,那么索引值是53,+ 1我得到了所需的索引,这样:
int index = List.FindIndex(x => x.StartsWith(numbStr));
但是如果我的输入数字更大,那么101例如string numbStr = "308";
索引结果是517,其中&#34; 500&#34;哪一行真的是499我得到了901等。列表中检查和计数的所有字符串都与序列的索引相等,与字符串名称相比,移位为-1。
所以不确定这个错误结果的原因是什么,需要建议才能搞清楚。
列表看起来像这样,可能是因为空格我不确定:
123 b4 c1 nnn
124 b4 c1 nnn
125 b4 c1 nnn
126 b4 c1 nnn
答案 0 :(得分:0)
例如,如果您将StartsWith
作为输入传递,则下面一行可能会导致您使用12
匹配123
和12
的问题。
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);
答案 1 :(得分:0)
变量List
应为list
。如果它是属性或方法,则仅以大写字母开头。
虽然我发现由于格式化很难理解你的情况,但我扣除了这三个假设:
将以字符串形式提供的数字,可以在列表中找到始终。
您的列表是有序的,因为它应该始终包含相应索引减去1的数字(列表[0] == -1,列表[1] == 0等)。
目标是检查提供的数字字符串是否存在于列表的正确位置(如果愿意,则列表的单元测试)。
按照这些假设,我会说解析字符串并检查指定的位置。这意味着您不必为每个提供的数字搜索整个列表(因此更快)。
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));