C# 从ILST中删除项目<;日志>;其中log.id存在于IList<;短>;
嗨,我是linq的新手,请原谅我的坏关键词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
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
可以更有效。嗯,两种方法都有优点和缺点。