C#列出在谓词中使用两个参数的removeall
本文关键字:两个 参数 removeall 谓词 | 更新日期: 2023-09-27 18:20:04
问题是我有一个对象列表(属于Class Wave)和一个关系函数:私有布尔AinB(波A,波B),如果A'在'B中,则返回true。AinB的(x,y)为true,则保证AinB是false。
删除列表中对象"位于"列表中另一个对象中的所有对象的最佳方法是什么?即,在删除之后,列表应该只包含与列表中任何其他对象都不处于"is in"关系的对象?
理想情况下,这可以作为轻松完成
listX.RemoveAll((x,y)=>AinB(x,y)),但这在C#中当然是不合法的,也没有简单的方法来指定删除哪个,x或y。
我想用索引循环浏览列表
int i = listX.Count - 1;
while (i>=0)
{
int r = listX.RemoveAll(X => AinB(X, listX[i]));
i = i - r - 1;
}
这似乎有效,但我想知道是否有更好的方法使用直接的linq代码来解决这个问题。谢谢
不幸的是,我想不出任何方法来做到这一点,至少不是O(n^2)。但好消息是,从LINQ的角度来看,这并不难:
listX.RemoveAll(item => listX.Any(isin => AinB(item, isin)));
使用normal for循环,该循环首先检查列表中最高的元素,然后检查列表中最低的元素。检查当前位置的元素在列表中是否有任何重复,如果发现,请删除当前元素(并可能减少迭代器)。
示例:
List<string> stuff = new List<string>(); //full of stuff
for(int i = stuff.Count - 1; i > 0; i--)
{
//Edited here for more efficiency.
for (int x = i - 1; x > 0; x--)
{
if (stuff[x] == stuff[i])
{
stuff.RemoveAt(i);
break; //or possibly continue;
}
}
}
这是手工编码的,所以可能会有一些语法错误,如果你发现有些地方不太对劲,请随时向我进行编辑。
如果你是一个使用LINQ的向导,你也可以尝试将列表中的对象分组,然后只为输出列表选择每组中的第一个对象。。
您可以使用LINQ Except调用,
List a = new List();
a.Add("a");
a.Add("b");
a.Add("c");
List b = new List();
b.Add("b");
b.Add("c");
b.Add("d");
List c = a.Except(b);
列表c将只包含项目"a";
你甚至可以通过给出一个比较对象来让它变得更聪明
List c = a.Except(b, new CompareObject());