[英]Searching a list of strings in C#
所以我想将这些LINQ函数之一与我拥有的List<string>
使用。
设置如下:
List<string> all = FillList();
string temp = "something";
string found;
int index;
当两个都用ToLower()
小写时,我想在all
与temp
匹配的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;
}
}
这可能是最快的,因为:
for
往往比快foreach
。 如果您要处理重复项,也可以很容易地对其进行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.