使用 linq 在列表中的对象中发现重复变量,然后在该对象中使用包含重复 objectId 的另一个变量



我是 linq 的新手,我已经尝试了这个应该检查重复项的函数。 我想做的是检查我的建筑对象列表,以检查是否有任何建筑对象包含与列表中另一个建筑对象相同的对象ID。 最后,我想使用具有重复项的建筑物对象的GUID, 并将其打印到我的日志中供用户查看。

public class FMBuildingObject
{
public Int64 ObjectId { get; set; }
public string GUID { get; set; }
}

建筑对象更大,但这是我使用的值。 接下来,我尝试使用建筑对象,查找重复项,然后打印出 GUID。但是我不知道如何访问该 GUID。

var query =
buildingObjects
.GroupBy(x => new { x })
.Select(group => new { Name = group.Key, Count = group.Count() })
.OrderByDescending(x => x.Count);

foreach (var q in query)
{
var updateLog = new LogServiceModel()
{
LogType = LogTypes.Warning, Parameters = { {?GUID?}}, LogTitle = "You have used two different classifications on a same Buildingobject in {0}. "
};
logService.Create(updateLog);
}

这将返回一个List<string>,其中包含具有重复ObjectId的对象的 GUID:

var result = buildingObjects
.GroupBy(b => b.ObjectId)
.Where(g => g.Count() > 1)
.SelectMany(g => g.Select(b => b.GUID)).ToList();

您可以通过以下方式获取重复对象:

var query = buildingObjects.GroupBy(x => new { x.ObjectId, x.GUID })
.Where(g => g.Count() > 1)
.Select(group => new { Name = group.Key, group.Key.GUID, group.Key.ObjectId }); //I don't know what is Name and why it's equal to Key

然后在你的 foreach 循环中:

foreach (var q in query)
{
var updateLog = new LogServiceModel()
{
LogType = LogTypes.Warning, Parameters = q.GUID, LogTitle = $"You have used two different classifications on a same Buildingobject, Id: {q.ObjectId}. "
};
logService.Create(updateLog);
}

或者你可以简单地做:

var query = buildingObjects.GroupBy(x => new { x.ObjectId, x.GUID })
.Where(g => g.Count() > 1)
.Select(group => new LogServiceModel() 
{ 
LogType = LogTypes.Warning, 
Parameters = group.Key.GUID, 
LogTitle = $"You have used two different classifications on a same Buildingobject, Id: {group.Key.ObjectId}." 
});

最新更新