所以我想在这个List<string>
中使用其中一个LINQ函数。
以下是设置:
List<string> all = FillList();
string temp = "something";
string found;
int index;
我希望string
中的all
与temp
匹配ToLower()
,当{{1}}低于{{1}}时。然后我将使用找到的字符串找到它的索引并将其从列表中删除。
如何使用LINQ执行此操作?
答案 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;
}
}
这可能是你能得到的最快,因为:
for
往往比foreach
快。如果您想处理重复项,也可以很容易地进行调整。