比较两个列表并使用linq返回不匹配的项目

Spe*_*n D 27 c# linq list c#-4.0

我有两个清单

List<Sent> SentList;
List<Messages> MsgList;
Run Code Online (Sandbox Code Playgroud)

两者都具有相同的属性,称为MsgID;

MsgList            SentList  

MsgID Content      MsgID Content Stauts
1       aaa        1       aaa     0
2       bbb        3       ccc     0
3       ccc        
4       ddd
5       eee
Run Code Online (Sandbox Code Playgroud)

我想比较Msglist中的MsgID与发送列表,并需要使用linq不在发送列表中的项目

Result 

MsgID Content
2       bbb
4       ddd
5       eee
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 35

你可以这样做:

HashSet<int> sentIDs = new HashSet<int>(SentList.Select(s => s.MsgID));

var results = MsgList.Where(m => !sentIDs.Contains(m.MsgID));
Run Code Online (Sandbox Code Playgroud)

这将返回所有MsgList没有匹配ID的消息SentList.

  • 这可能是最好的方法 (2认同)

lc.*_*lc. 15

天真的方法:

MsgList.Where(x => !SentList.Any(y => y.MsgID == x.MsgID))
Run Code Online (Sandbox Code Playgroud)

请注意,这将需要最多m*n,因为它比较每一个操作MsgIDSentList,以各MsgList("达人",因为它会短路,当它没有正好匹配).

  • 如果你打算投票,你至少可以帮我解释原因. (4认同)

And*_*lil 14

嗯,你已经有了很好的答案,但他们是大多数Lambda.更多的LINQ方法就像

var NotSentMessages =
                from msg in MsgList
                where !SentList.Any(x => x.MsgID == msg.MsgID)
                select msg;
Run Code Online (Sandbox Code Playgroud)


Tus*_*tel 10

你可以这样做,这是最快的过程

Var result = MsgList.Except(MsgList.Where(o => SentList.Select(s => s.MsgID).ToList().Contains(o.MsgID))).ToList();
Run Code Online (Sandbox Code Playgroud)

这将为您提供预期的输出。


Eri*_* J. 8

你可以做点什么

var notSent = MsgSent.Except(MsgList, MsgIdEqualityComparer);
Run Code Online (Sandbox Code Playgroud)

您需要提供MSDN上列出的自定义相等比较器

http://msdn.microsoft.com/en-us/library/bb336390.aspx

只需在每个相应类型的MsgID属性上具有相等比较基本相等性.由于相等比较器比较了相同类型的两个实例,因此您需要定义SentMessages实现的具有MsgID属性的接口或公共基本类型.


Ast*_* E. 5

.NET 6中,您可以利用.ExceptBy(),它允许您定义第一个列表的哪个属性来比较第二个列表中的项目:

List<Message> result = messages
    .ExceptBy(sentList.Select(msg => msg.MsgID), msg => msg.MsgID)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

messagesMsgID是第一个列表,而属性的集合sentList是第二个列表。

示例小提琴在这里


注意:
.ExceptBy()产生两个集合之间的集合差异--> 只有不同的值才会出现在结果集合中。这意味着如果messages多次包含相同的值(例如{ "aaa", "bbb", "ccc", "ddd", "ddd", "eee" }),则结果集合中的任何重复项都将被删除(--> { "bbb", "ddd", "eee" })。