如何获取列表中找到的字符串索引并等于输入字符串

时间:2016-12-28 03:40:11

标签: c# string linq list indexing

我试图从列表中获取已创建字符串的索引号。我有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

2 个答案:

答案 0 :(得分:0)

例如,如果您将StartsWith作为输入传递,则下面一行可能会导致您使用12匹配12312的问题。

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. 将以字符串形式提供的数字,可以在列表中找到始终

  2. 您的列表是有序的,因为它应该始终包含相应索引减去1的数字(列表[0] == -1,列表[1] == 0等)。

  3. 目标是检查提供的数字字符串是否存在于列表的正确位置(如果愿意,则列表的单元测试)。

  4. 按照这些假设,我会说解析字符串并检查指定的位置。这意味着您不必为每个提供的数字搜索整个列表(因此更快)。

    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));