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代码来解决这个问题。谢谢

C#列出在谓词中使用两个参数的removeall

不幸的是,我想不出任何方法来做到这一点,至少不是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());