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.
lc.*_*lc. 15
天真的方法:
MsgList.Where(x => !SentList.Any(y => y.MsgID == x.MsgID))
Run Code Online (Sandbox Code Playgroud)
请注意,这将需要最多m*n,因为它比较每一个操作MsgID中SentList,以各MsgList("达人",因为它会短路,当它没有正好匹配).
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)
这将为您提供预期的输出。
你可以做点什么
var notSent = MsgSent.Except(MsgList, MsgIdEqualityComparer);
Run Code Online (Sandbox Code Playgroud)
您需要提供MSDN上列出的自定义相等比较器
http://msdn.microsoft.com/en-us/library/bb336390.aspx
只需在每个相应类型的MsgID属性上具有相等比较基本相等性.由于相等比较器比较了相同类型的两个实例,因此您需要定义Sent和Messages实现的具有MsgID属性的接口或公共基本类型.
在.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" })。
| 归档时间: |
|
| 查看次数: |
78644 次 |
| 最近记录: |