gpt4 book ai didi

c# - 无法在 LINQ C# 中排序和删除重复项

转载 作者:太空宇宙 更新时间:2023-11-03 19:39:35 25 4
gpt4 key购买 nike

我目前想对 LINQ 上的对象列表进行排序,如果找到,我需要在其中排序并删除重复项。如果我为我的场景提供简单的示例会更容易。

这是我当前的列表(我已经对其进行了简化和排序):

{
"data": [
{
"userActivityId": 17,
"deviceId": 2,
"name": "Apple Iphone X 2013 32 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
{
"userActivityId": 16,
"deviceId": 1,
"name": "Apple Iphone X 2013 16 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
{
"userActivityId": 15,
"deviceId": 1,
"name": "Apple Iphone X 2013 16 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
{
"userActivityId": 14,
"deviceId": 2,
"name": "Apple Iphone X 2013 32 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
]
}

预期结果

我真正想要的是:

{
"data": [
{
"userActivityId": 17,
"deviceId": 2,
"name": "Apple Iphone X 2013 32 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
{
"userActivityId": 16,
"deviceId": 1,
"name": "Apple Iphone X 2013 16 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
]
}

在这里我们可以看到 userActivityId 1514 被删除了,因为 name 已经存在了。

因此我们可以使用 name 进行唯一排序。

我尝试过的

第一次尝试

这是排序功能的原始代码。

var data = new leapserverdbContext().TbUserActivity
.OrderByDescending(id => id.UserActivityId)
.Select(sel => new
{
sel.UserActivityId,
sel.TbDevice.DeviceId,
Name = sel.TbDevice.TbDeviceBrand.Name + " " + sel.TbDevice.Name +
" " + sel.TbDevice.TbDeviceYear.Year + " " + sel.TbDevice.TbDeviceSize.Size,
sel.TbDevice.IconResource
})
.ToList();

第二次尝试

我尝试放置 Distinct(),但它不起作用,因为存在 userActivityId 并且它是唯一的(因为递增)。

第三次尝试

我尝试删除 userActivityId,以避免在 Distinct() 时考虑它,但我的数据不会被排序。因为排序取决于在 userActivityId 上。

第四次尝试

我尝试使用 GroupBy (x => x.Name),因此重点根据唯一名称进行划分。但它只是开始将它们分成数组,如下所示:

{
"data": [
[
{
"userActivityId": 16,
"deviceId": 1,
"name": "Apple Iphone X 2013 16 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
{
"userActivityId": 15,
"deviceId": 1,
"name": "Apple Iphone X 2013 16 GB",
"iconResource": "phone_apple_iphone_x.jpg"
}
],
[
{
"userActivityId": 17,
"deviceId": 2,
"name": "Apple Iphone X 2013 32 GB",
"iconResource": "phone_apple_iphone_x.jpg"
},
{
"userActivityId": 14,
"deviceId": 2,
"name": "Apple Iphone X 2013 32 GB",
"iconResource": "phone_apple_iphone_x.jpg"
}

]
]
}

现在根据它们唯一的名称进行排序和划分。但布局完全不同。

在我看来会做的是获取第一个数组(因为它是最新的),但我如何组合并生成预期结果(见上文)。

有什么办法可以解决我的这个小问题吗?

最佳答案

除了像之前建议的那样使用 EqualityComparer 之外,您还可以根据 name-property 对结果进行分组,因为在这种情况下您使用的是匿名类型。

var data = new leapserverdbContext().TbUserActivity
.OrderByDescending(id => id.UserActivityId)
.Select(sel => new
{
sel.UserActivityId,
sel.TbDevice.DeviceId,
Name = sel.TbDevice.TbDeviceBrand.Name + " " + sel.TbDevice.Name +
" " + sel.TbDevice.TbDeviceYear.Year + " " + sel.TbDevice.TbDeviceSize.Size,
sel.TbDevice.IconResource
})
.GroupBy(x => x.Name)
.Select(g => g.First())
.ToList();

关于c# - 无法在 LINQ C# 中排序和删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com