C# 从ILST中删除项目<;日志>;其中log.id存在于IList<;短>;

C# 从ILST中删除项目<;日志>;其中log.id存在于IList<;短>;,c#,linq,C#,Linq,嗨,我是linq的新手,请原谅我的坏关键词 IList<Log> pendingLogs = rep.GetAllPending(); IList<Short> pendingMessageInQueue = PendingCommandModel.GetPendingMessagesIds(); IList pendingLogs=rep.GetAllPending(); IList pendingMessageInQueue=PendingCommandMode

嗨,我是linq的新手,请原谅我的坏关键词

 IList<Log> pendingLogs = rep.GetAllPending();
 IList<Short> pendingMessageInQueue = PendingCommandModel.GetPendingMessagesIds();
IList pendingLogs=rep.GetAllPending();
IList pendingMessageInQueue=PendingCommandModel.GetPendingMessagesIds();
我有两张单子。 我想从
pendingLogs
中删除项,其中item.Id存在于
pendingMessageInQueue
中。
如果在这种情况下更合适的话,我也可以使用
IEnumerable

创建一个包含所有要保留的项目的新列表,您可以使用
!包含

pendingLogs = pendingLogs 
    .Where(pl => !pendingMessageInQueue.Contains(pl.id))
    .ToList();

如果要保留原始列表,可以使用简单联接获取要删除的项目:

 foreach(var log in pendingMessageInQueue.Join(pendingLogs, 
                                               (id) => id,
                                               (log) => log.Id,
                                               (id, log) => log))
{
    pendingLogs.Remove(log);
}

如果它实际上是一个
列表
你可以使用
List.RemoveAll
,它不需要创建一个新的临时列表。你能建议我什么时候使用Ilist或IEnumerable吗???@ShankerPaudel:
IEnumerable
是接口
列表
是一个实现。如果希望集合的用户无法轻松修改它,请使用适当的类型,使其成为
IEnumerable
,因为它不支持
Add
Remove
方法。如果希望以后可以(或必须)更改集合,请使用
列表
。如果集合完全填满,我倾向于使用
IEnumerable
来封装它。编辑并阅读:(LINQ仅回答)此外,如果您希望集合的用户不能修改它,您可以使用
List
类的
AsReadOnly()
方法,这样
IEnumerable
就不能被转换回
List
并进行修改。您确定这样做有效吗?您正在从
foreach
中的列表中删除项,这将引发“集合已修改;枚举操作可能无法执行”异常。@TimSchmelter是的,我确定。它之所以有效,是因为
pendingLogs
是联接的内部部分,它将在
join
方法内转换为
LookUp
。因此,当调用
Remove
时,将枚举
pendingLogs
本身。但是当
pendingLogs
连接外部部分时,它会失败。你是对的。然而,我发现很难记住是否允许这样做。这就是为什么在这种情况下我更喜欢一种不同的方法,尽管
Join
可以更有效。嗯,两种方法都有优点和缺点。