используя linq, чтобы обнаружить дублирующую переменную внутри объекта в списке, затем использовать другую переменную в указанном объекте, которая содержит дубликат objectId - PullRequest
0 голосов
/ 18 октября 2018

Я новичок в linq, и я пробовал эту функцию, которая должна проверять наличие дубликатов.то, что я хочу сделать, - это просмотреть мой список строительных объектов, чтобы проверить, содержит ли какой-либо строительный объект идентификатор объекта, идентичный другому строительному объекту в списке.наконец, я хочу использовать GUID объекта buildingObject, который имел дубликат, и распечатать его в своем журнале, чтобы пользователь мог его увидеть.

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);
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Это вернет List<string>, содержащий GUID объектов, которые имеют дубликаты ObjectId:

var result = buildingObjects
    .GroupBy(b => b.ObjectId)
    .Where(g => g.Count() > 1)
    .SelectMany(g => g.Select(b => b.GUID)).ToList();
0 голосов
/ 18 октября 2018

Вы можете получить дубликаты объектов:

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}." 
                            });
...