C#如何从一个列表中移除另一个列表?

9
有没有一种方便的方法,可以从另一个列表中删除嵌套列表,如果满足某些要求的话?例如,假设我们有一组站点,并决定称每个站点集合为一条路线。每个路线都以列表形式存在。然后,我们决定将每个路线也放入列表中。
现在,既然我们有了一系列路线,有人决定某些类型的路线真的不应该包含在路线列表中。我该如何删除这些路线呢?以下是一些样例代码:
示例类
public class Stops
{
    public Stops(int _param1, string _param2)
    {
        param1 = _param1;
        param2 = _param2;
    }

    public int param1 { get; set; }
    public string param2 { get; set; }
}

创建列表
List<List<Stops>> lstRoutes = new List<List<Stops>>();
List<Stops> lstStops = new List<Stops>();
List<Stops> lstMoreStops = new List<Stops>();

// Create some stops
for (int i = 0; i < 5; i++)
{
    lstStops.Add(new Stops(i, "some text"));
}

lstRoutes.Add(lstStops);

// Create some more stops
for (int i = 5; i < 10; i++)
{
    lstMoreStops.Add(new Stops(i, "some more text"));
}

lstRoutes.Add(lstMoreStops);

如何从lstRoutes中删除任何具有param1值大于6的路由?

2个回答

10

最简单的方法(适用于所有可枚举的对象,而不仅仅是列表)是:

lstRoutes = lstRoutes.Where(r => !r.Any(s => s.param1 > 6)).ToList();

上述代码片段创建了一个新列表,因此会发生复制操作,这意味着性能和内存使用都会略微受到影响。最有效的方法是一开始就不将这些项添加到列表中。

第二个最有效的方法是从列表中删除项目而不是构建新列表,这样内存使用率就不会受到太大的影响:

lstRoutes.RemoveAll(r => r.Any(s => s.param1 > 6));

哈,我希望我能避免一开始就将它们添加到列表中。不幸的是,起始列表是一堆排列组合,我需要做的是摆脱那些没有意义的排列组合。你发布的第一段代码抛出了以下错误:无法将 lambda 表达式转换为类型,因为它不是委托类型。但第二段代码运行得很好。非常感谢! - Brent Barbata
你知道我怎么能得到param1的索引吗?我知道在这种情况下它总是0,但是假设每个路由都包含一堆整数,我想删除所有在7之前出现6的路由。如果不行也没关系,我要么自己解决,要么提出另一个问题。 - Brent Barbata
@BrentBarbata,很抱歉我现在才看到你的评论。希望你在十年后不再需要关于这个问题的帮助 :) - Sedat Kapanoglu

0
List<Stops> stop = lstRoutes.Find(delegate(List<Stops> stp) { return stp.param1 > 6; });

非常感谢您的回复,但我似乎无法使其工作。我收到了以下错误:'System.Collections.Generic.List<Stops>'不包含'param1'的定义,并且没有接受类型为'Stops'的第一个参数的扩展方法'param1'可以找到。 - Brent Barbata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接