我正在尝试将两个列表合并为一个没有重复项的列表
JOIN运算符仅返回公共元素
这些是JSON格式的列表
列表1为:
{
"screenID": 96,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": true
},
{
"screenID": 97,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": true
},
{
"screenID": 98,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": true
}
列表2为:
{
"screenID": 96,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": false
},
{
"screenID": 97,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": false
}
如果ScreenID相同,则我希望在CRUD元素之间进行比较,如下所示:
if(ScreenID == 96){
Create = List1.Create == true && List2.Create == false ? true : false
}
我试过这个:变量finalList =列表1.联合(列表2);
但结果是
{
"screenID": 96,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": true
},
{
"screenID": 97,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": true
},
{
"screenID": 98,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": true
},
{
"screenID": 96,
"create": true,
"read": true,
"update": true,
"delete": true,
"print": false
},
{
"screenID": 97,
"create": true,
"read": true,
"update": true,
"delete": true,
我是LINQ的初学者,所以任何帮助都很感激
编辑我使用的是.NET 3.1
3条答案
按热度按时间8nuwlpux1#
**编辑:**我做了一些修改,使我原来的答案适应.Net 3.5,如果你使用C# 7.3或更高版本,现在应该可以工作了(在你的.csproj文件中由
<LangVersion>7.3</LangVersion>
设置)。我放弃了HashSet<T>
,改为Dictionary<T>
,这实际上使整个事情变得不那么冗长。虽然现有的答案是好的,但我想添加一个替代方法,使用扩展方法,本质上应该做与
UnionBy
相同的事情,但接受一个额外的Func<T, T, T>
来处理重复。UnionComparer
使它有点冗长,但这实际上只是为键选择器 Package 了IEqualityComparer<TKey>
。我为您的数据创建了一个简单的示例类:
用法:
**编辑:**我刚才看到您只能使用.Net 3.5,我不确定您是否需要对此进行任何更改,但应该支持
HashSet<T>
和IEqualityComparer<T>
3npbholx2#
.NET 6引入了UnionBy,可用于基于表达式合并两个集合。当发现重复项时,该方法返回遇到的第一个项。应首先对这两个集合进行排序,以控制返回哪个项:
对于更复杂的逻辑,应修改顺序表达式以确保所需的项位于第一位。例如,要选择具有最多标志的项,可使用
Enumerable.Count(t=>t)
:使用区分方式
在以前的版本中,.NET版本可以使用MoreLINQ库。没有
UnionBy
,但是DistinctBy
可以在连接后用于相同的作业。同样,顺序控制返回的内容:DistinctBy在.NET 6中也可用。
ffx8fchx3#
有阶级
这个简单的联合工作: