C# 根据其他w.r.t.位置从列表中删除项目

C# 根据其他w.r.t.位置从列表中删除项目,c#,linq,C#,Linq,我有两个列表,例如: 现在,如果我想去掉a,b,c,g,h,I;因为他们在L1上的通讯员是1,那么LINQ应该是什么呢 我可以通过以下方式获得L1中的索引: var L1IDX = L1.Select((it, id) => new { itm = it, idx = id }) .Where(l => l.itm == 1) .Select(l => l.idx); 那又怎么样?我找不到删除。。。这需要一个索引列表。没

我有两个列表,例如:

现在,如果我想去掉a,b,c,g,h,I;因为他们在L1上的通讯员是1,那么LINQ应该是什么呢

我可以通过以下方式获得L1中的索引:

var L1IDX = L1.Select((it, id) => new { itm = it, idx = id })
              .Where(l => l.itm == 1)
              .Select(l => l.idx);

那又怎么样?我找不到删除。。。这需要一个索引列表。

没有重载需要一个索引列表,但是有一个方法用于单个索引,RemoveAt。您需要在循环中调用它:

foreach(var index in L1IDX.OrderByDescending(x=>x))
    L2.RemoveAt(index);
如果您发现自己想要经常按索引删除许多项,您可能会发现使用扩展方法从列表中删除所有索引序列是值得的;它基本上与上面一样,用一个方法包装:

public static void RemoveAllAt<T>(this IList<T> list,
    IEnumerable<int> indecies)
{
    foreach (var index in indecies.OrderByDescending(x => x))
        list.RemoveAt(index);
}

没有采用索引列表的重载,但是有一个用于单个索引的方法RemoveAt。您需要在循环中调用它:

foreach(var index in L1IDX.OrderByDescending(x=>x))
    L2.RemoveAt(index);
如果您发现自己想要经常按索引删除许多项,您可能会发现使用扩展方法从列表中删除所有索引序列是值得的;它基本上与上面一样,用一个方法包装:

public static void RemoveAllAt<T>(this IList<T> list,
    IEnumerable<int> indecies)
{
    foreach (var index in indecies.OrderByDescending(x => x))
        list.RemoveAt(index);
}

首先,不能使用LINQ修改列表。您可以使用所需的值创建新列表

var query = L1.Zip(L2, (f, s) => new {F = f, S = s})
            .Where(f => f.F != 1).Select(r => r.S);

首先,不能使用LINQ修改列表。您可以使用所需的值创建新列表

var query = L1.Zip(L2, (f, s) => new {F = f, S = s})
            .Where(f => f.F != 1).Select(r => r.S);
试试这个-

使用此方法,您不必完全创建新序列

试试这个-

使用此方法,您不必完全创建新序列



L2不是列表如果a..f之前定义为int变量:是的,这使它成为可能。L2不是列表如果a..f之前定义为int变量:是的,这使它成为可能。这不会中断,因为在为index=0调用RemoveAtindex之后,所有索引都将在一个点上移动?@evanmcdonnal True,你需要确保从最后一刻开始。我想从技术上讲,你只需调用Reverse就可以了,但在我看来,这增加了一点清晰度。哦,嘿,这是一个聪明的解决方案。我本来打算做一件更复杂的事,但没有更有效的+一个我不必阅读文档就能理解咳嗽的解决方案。有趣的是:对明显错误的答案投两张赞成票。@HamletHakobyan在什么方面不起作用?请注意,您的答案在技术上并没有回答这个问题,这个问题要求从列表中删除项目,而不是创建一个包含不应删除项目的新列表。这难道不会中断吗?因为在您调用RemoveAtindex for index=0后,所有索引都将移到一个位置上?@evanmcdonnal True,你需要确保从最后一刻开始。我想从技术上讲,你只需调用Reverse就可以了,但在我看来,这增加了一点清晰度。哦,嘿,这是一个聪明的解决方案。我本来打算做一件更复杂的事,但没有更有效的+一个我不必阅读文档就能理解咳嗽的解决方案。有趣的是:对明显错误的答案投两张赞成票。@HamletHakobyan在什么方面不起作用?请注意,您的答案在技术上没有回答要求从列表中删除项目的问题,而不是创建一个包含不应删除项目的新列表。正确,但应为x.I!=1,否?正确,只是它应该是x.I!=1,否?他没有表示应使用LINQ移除项目。您[可以]使用LINQ查找要删除的索引,然后使用非LINQ代码删除它们。这是完全合理的。他没有表示应该使用LINQ删除这些项目。您[可以]使用LINQ查找要删除的索引,然后使用非LINQ代码删除它们。这是完全合理的。