在C#中搜索字符串列表

时间:2011-10-16 21:59:42

标签: c# .net string linq list

所以我想在这个List<string>中使用其中一个LINQ函数。

以下是设置:

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

我希望string中的alltemp匹配ToLower(),当{{1}}低于{{1}}时。然后我将使用找到的字符串找到它的索引并将其从列表中删除。

如何使用LINQ执行此操作?

5 个答案:

答案 0 :(得分:4)

我觉得你不太关心比较小写版本,就像你只是执行不区分大小写的匹配一样。如果是这样的话:

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

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

答案 1 :(得分:0)

好的,我看到my imperative solution没有得到任何爱,所以这里有一个可能效率较低的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);

答案 2 :(得分:-1)

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

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

然后你就拥有了那些没有这些项目的清单。

答案 3 :(得分:-2)

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

答案 4 :(得分:-3)

使用最适合工作的工具。在这种情况下,一段简单的过程代码似乎比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(索引))。
  • 在不构建新列表的情况下删除元素(O(all.Count-index))。
  • 没有使用任何代表。
  • 直线for往往比foreach快。

如果您想处理重复项,也可以很容易地进行调整。