【问题标题】:Searching in a list for a specified string在列表中搜索指定字符串
【发布时间】:2016-09-20 16:39:52
【问题描述】:

我正在尝试搜索字符串列表。我希望能够返回包含字符串信息的任何找到的结果。例如:

(我已经有一个包含值的列表)列表字符串包含

“狗”、“猫”、“狗屋”、“狗”、“老鼠”

我想要一种检查字符串的方法,例如:

string dog = "dog"

并返回值:

“狗”、“狗屋”、“狗”

这是我目前所拥有的,至少是我需要帮助的部分。

Console.WriteLine("What would you like to search for (Title: Full Title; Author: first, last): ");
search = Console.ReadLine();

var results = bookList.Where(x => x.Contains(search)).ToList();
if (results != null)
{
    Console.WriteLine(results);
    //i--;
    search = String.Empty;
    clearvars results;
    Console.WriteLine("Press Enter to continue");
    Console.ReadLine();
    continue;
}

search 是一个空字符串

bookList 是我的List<string>

i 只是一个计数器,对此并不真正需要

如果有任何改变,我将在 for 循环中完成这一切。

【问题讨论】:

  • 请发布minimal reproducible example,其中包含您注册的确切书名以及您要搜索的确切字符串。现在我们都看不到,所以我们不得不猜测它为什么不起作用。例如,您是否知道 string.Contains 区分大小写,因此,例如,如果您在列表中的书名是“Doghouse”,则搜索“dog”(小写 d)将不匹配.
  • 此时,用户输入书名。如果它区分大小写,对我来说并不重要。此外,您正在搜索的内容也是由用户输入的。对不起...
  • 你误解了我的意思。我并不是要您更改程序,我的意思是您要为这个问题创建一个示例,该示例展示了相同的问题,但非常完整,我们可以查看代码。例如,如果您稍后说“哦,顺便说一句,用户输入书名是 Doghouse,然后他搜索 dog”,那么我们回到我上面的评论。由于我们不知道用户做了什么,您能否为我们复制一个具体的案例,以便我们可以帮助您?否则我们只能猜测。
  • 哎呀,我马上就明白了,所以,你基本上想要 else 语句吗?或者你想要更多我的代码,还是想要我所有的代码?
  • 我希望您使用一些字符串(例如您拥有的示例字符串)预先设置要搜索的内容列表,并使用“dog”填充要搜索的字符串,然后看看会发生什么.到那时您可能会发现问题所在。另请注意,如果您想要大小写 insensitive 搜索,您不能只使用.Contains

标签: c# string list search


【解决方案1】:

您需要迭代结果的每个元素(results 变量)。

Console.WriteLine("What would you like to search for (Title: Full Title; Author: first, last): ");
search = Console.ReadLine();
var results = bookList.Where(x => x.Contains(search)).ToList();
if (results != null)
{
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }
    Console.WriteLine("Press Enter to continue");
    Console.ReadLine();
}

您需要迭代results,因为它是一个列表。当您像这样将列表传递给Console.WriteLine() 时:Console.WriteLine(results) 方法ToString()results 上被调用。 在 List 上调用 ToString() 会返回:System.Collections.Generic.List1[System.String],这可能是您在控制台上看到的。

System.Collections.Generic.List1[System.String] 是列表对象的字符串表示形式,但您真正感兴趣的是列表的元素。这就是为什么您需要迭代列表并分别打印每个元素的原因。

您也可以将results 列表中的所有元素连接成一个字符串,然后打印出来:

var allResultsInOneString = string.Join(", ", results);
Console.WriteLine(allResultsInOneString);

【讨论】:

  • 非常感谢,这非常有效。另外,感谢您解释一切。
【解决方案2】:

您需要像foreach 这样的循环来遍历结果:

foreach (var item in results)
{
    Console.WriteLine(item);
}

因为正如您所说我希望能够返回任何找到的结果,但是由于 resultsstrings 的列表,因此您需要遍历列表以打印其中的每个项目列表。

【讨论】:

  • 在这种情况下会是什么项目?
  • @DatDudeAgain 看了Documentation for foreach之后,你应该可以确定item是什么
  • @SamIam 谢谢!
  • @S.Akbari -- 你为什么如此坚持“需要”迭代?我在我的答案中展示了一个您没有使用的示例,即改用 LINQ。
【解决方案3】:

这是一种方法:

string[] searchList = new[] { "dog", "cat", "doghouse", "doge", "mouse" };
string searchString = "dog";
var matches = searchList.Where((x) => Regex.IsMatch(x, searchString));

【讨论】:

    【解决方案4】:

    如果你想使用 linq,你也可以这样做:

      bookList.Where(x => x.Contains(search)).ToList().ForEach(x => Console.WriteLine(x));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多