繁体   English   中英

在C#中搜索字符串列表

[英]Searching a list of strings in C#

所以我想将这些LINQ函数之一与我拥有的List<string>使用。

设置如下:

List<string> all = FillList();
string temp = "something";
string found;
int index;

当两个都用ToLower()小写时,我想在alltemp匹配的string中找到该string 然后,我将使用找到的字符串找到它的索引并将其从列表中删除。

如何使用LINQ做到这一点?

我觉得您不喜欢比较小写版本,而是只执行不区分大小写的匹配。 如果是这样的话:

var listEntry = all.Where(entry => 
          string.Equals(entry, temp, StringComparison.CurrentCultureIgnoreCase))
         .FirstOrDefault();

if (listEntry != null) all.Remove(listEntry);

好的,我看到我的命令性解决方案没有得到任何爱,因此这是一种LINQ解决方案,它的效率可能较低,但仍避免两次在列表中进行搜索(这是公认的答案中的问题):

var all = new List<string>(new [] { "aaa", "BBB", "Something", "ccc" });
const string temp = "something";

var found = all
    .Select((element, index) => new {element, index})
    .FirstOrDefault(pair => StringComparer.InvariantCultureIgnoreCase.Equals(temp, pair.element));

if (found != null)
    all.RemoveAt(found.index);

您也可以执行此操作(它可能比上面的功能更好,因为它不会为每个元素创建新对象):

var index = all
    .TakeWhile(element => !StringComparer.InvariantCultureIgnoreCase.Equals(temp, element))
    .Count();

if (index < all.Count)
    all.RemoveAt(index);

我想补充以前的答案...为什么不这样做呢?

string temp = "something";
List<string> all = FillList().Where(x => x.ToLower() != temp.ToLower());

然后,您将获得列表,而没有那些项。

all.Remove(all.FirstOrDefault(
            s => s.Equals(temp,StringComparison.InvariantCultureIgnoreCase)));

使用最适合工作的工具。 在这种情况下,一段简单的程序代码似乎比LINQ更合适:

var all = new List<string>(new [] { "aaa", "BBB", "Something", "ccc" });
const string temp = "something";
var cmp = StringComparer.InvariantCultureIgnoreCase; // Or another comparer of you choosing.

for (int index = 0; index < all.Count; ++index) {
    string found = all[index];
    if (cmp.Equals(temp, found)) { 
        all.RemoveAt(index);
        // Do whatever is it you want to do with 'found'.
        break;
    }
}

这可能是最快的,因为:

  • 就地进行比较-不会仅出于比较目的而创建临时的大写(或小写)字符串。
  • 元素仅被搜索一次(O(index))。
  • 元素将在不构建新列表的情况下就位删除(O(all.Count-index))。
  • 不使用代表。
  • for往往比快foreach

如果您要处理重复项,也可以很容易地对其进行修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM