проверять дубликаты идентификаторов объектов в списке внутри списка - PullRequest
0 голосов
/ 15 октября 2018

Я очень стараюсь обдумать, как решить эту проблему: в настоящее время я работаю со списком «buildingObjects», который содержит ссылку, и другим списком с «assets», который содержит «ObjectId».

            var typeBuildingPart = new List<IfcBuildingPart> {
            new IfcBuildingPart{
                BIMId = "iojeofhwofh308ry308hi32r08yrh",
                Reference = "234",
                Assets = new List<IfcAsset> {
                    new IfcAsset{
                        ObjectID = 6111838616,
                    }
                }
            },
                            new IfcBuildingPart{
                Reference = "235",
                Assets = new List<IfcAsset> {
                    new IfcAsset{
                        ObjectID = 6111838616,
                    }
                }
            },
               new IfcBuildingPart{
                Reference = "235",
                Assets = new List<IfcAsset> {
                    new IfcAsset{
                        ObjectID = 6111838616,
                    }
                }
            },
        };

Цель состоит в том, чтобы выполнить итерации по ссылкам и объектным идентификаторам, чтобы проверить, существует ли какой-либо экземпляр, где объектный идентификатор может иметь другую ссылку (как показано во фрагменте кода, где объектный идентификатор ресурсов одинаков)., но они не имеют одинаковую ссылку, а затем, наконец, сохраняют ссылку, на которую ссылались чаще всего. Я пытался сделать несколько циклов for, но в итоге не смог. Есть ли хорошие методы linq для решения этой проблемы?или какие-нибудь указатели? спасибо!

должно быть более одного актива, но я выбрал только один для каждой части здания, чтобы продемонстрировать проблему ObjectId

, окончательный результат должен заключаться в том, что ifcassetсо ссылкой 234 следует удалить.

Ответы [ 2 ]

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

Посмотрите, поможет ли приведенный ниже код.Я создал два словаря, которые отображаются от объекта к ссылке, а затем ссылаются на объект

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
         static void Main(string[] args)
        {
            var typeBuildingPart = new List<IfcBuildingPart> {
                new IfcBuildingPart{
                    BIMId = "iojeofhwofh308ry308hi32r08yrh",
                    Reference = "234",
                    Assets = new List<IfcAsset> {
                        new IfcAsset{
                            ObjectID = 6111838616,
                        }
                    }
                },
                                new IfcBuildingPart{
                    Reference = "235",
                    Assets = new List<IfcAsset> {
                        new IfcAsset{
                            ObjectID = 6111838616,
                        }
                    }
                },
                   new IfcBuildingPart{
                    Reference = "235",
                    Assets = new List<IfcAsset> {
                        new IfcAsset{
                            ObjectID = 6111838616,
                        }
                    }
                }
             };

            var dictRefToObj = typeBuildingPart.GroupBy(x => x.Reference, y => y.Assets.Select(z => z.ObjectID))
                .ToDictionary(x => x.Key, y => y.SelectMany(z => z).GroupBy(a => a).Select(a => new { obj = a.Key, count = a.Count()}).ToList());


             var dictObjToRef = dictRefToObj.Select(x => x.Value.Select(y => new { reference = x.Key, obj = y.obj, count = y.count })).SelectMany(z => z)
                .GroupBy(x => x.obj, y => new { reference = y.reference, count = y.count})
                .ToDictionary(x => x.Key, y => new { total = y.Select(z => z.count).Sum(), references = y.Select(z => new { reference = z.reference, count = z.count}).ToList()});


        }
    }
    public class IfcBuildingPart
    {
        public string BIMId { get; set; }
        public string Reference { get; set; }
        public List<IfcAsset> Assets { get; set; }
    }
    public class IfcAsset
    {
        public long ObjectID { get; set; }
    }
}
0 голосов
/ 15 октября 2018

Сначала отфильтруйте список, чтобы включить в него только элемент с хотя бы одним IfcAsset, соответствующим вашему критерию.Сгруппируйте на Reference и посчитайте количество вхождений.Таким образом, вы можете заказать по счету и принять первый.

var data = new List<Foo> {
    new Foo{Ref="A", Bars= new List<Bar>{ new Bar {Id="Good" } } },
    new Foo{Ref="B", Bars= new List<Bar>{ new Bar {Id="NotMe" } } },
    new Foo{Ref="C", Bars= new List<Bar>{ new Bar {Id="Good" } } },
    new Foo{Ref="C", Bars= new List<Bar>{ new Bar {Id="Good" } } }
};

var result = data.Where(x => x.Bars.Any(b => b.Id == "Good"))
                 .GroupBy(x => x.Ref)
                 .Select(g => new { count = g.Count(), item=g.First() })
                 .OrderByDescending(x=> x.count)
                 .Select(x=> x.item)
                 .First();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...