как объединить "collectionResult" на основе DataType - PullRequest
3 голосов
/ 18 марта 2020

У меня структура ниже класса,

 public class CollectionProperty
{
    public string Name { get; set; }

    public object Value { get; set; }
    public string DataType { get; set; }
}

public class Instance
{
    public string Name { get; set; }
    public List<CollectionProperty> CollectionProperties { get; set; }
}

public class CollectionResult
{
    public string Asset { get; set; }
    public List<Instance> Instances { get; set; }
}

У меня результат ниже коллекции с 2 экземплярами, имеющими различные свойства коллекции с двумя типами данных double и string.

var collectionResult = new CollectionResult
        {
            Asset = "A1",
            Instances = new List<Instance>
            {
                new Instance
                {
                    Name = "Instance-1",
                    CollectionProperties = new List<CollectionProperty>
                    {
                        new CollectionProperty {Name = "N1", Value = 10, DataType = "Double"},
                        new CollectionProperty {Name = "N2", Value = "S1", DataType = "String"}
                    }
                },
                new Instance
                {
                    Name = "Instance-2",
                    CollectionProperties = new List<CollectionProperty>
                    {
                        new CollectionProperty {Name = "N1", Value = 20, DataType = "Double"},
                        new CollectionProperty {Name = "N2", Value = "S2", DataType = "String"}
                    }
                }
            }
        };

Теперь моя цель разделить результаты коллекции на различные экземпляры и сгруппировать их по типу данных. С приведенным ниже кодом я могу разделить пут, но он дает мне 4 результата сбора, но он должен дать 2 (2 для двойной и 2 для строки), пожалуйста, предложите. Спасибо!

enter image description here

var X = collectionResult.Instances
            .SelectMany(collectionInstance => collectionInstance.CollectionProperties,
                (collectionInstance, collectionProperty) =>
                    new
                    {
                        CollectionResult = new CollectionResult
                        {
                            Asset = collectionResult.Asset,
                            Instances = new List<Instance>
                            {
                                new Instance
                                {
                                    Name = collectionInstance.Name,
                                    CollectionProperties = new List<CollectionProperty>
                                    {
                                        collectionProperty
                                    }
                                }
                            },
                        },
                        Instance = collectionInstance.Name,
                        Property = collectionProperty.Name,
                        DataType = collectionProperty.DataType
                    });

1 Ответ

3 голосов
/ 18 марта 2020

Вам просто нужно просто добавить оператор GroupBy после вашего selectMany:

var X = collectionResult.Instances
        .SelectMany(collectionInstance => collectionInstance.CollectionProperties,
            (collectionInstance, collectionProperty) =>
                new
                {
                    CollectionResult = new CollectionResult
                    {
                        Asset = collectionResult.Asset,
                        Instances = new List<Instance>
                        {
                            new Instance
                            {
                                Name = collectionInstance.Name,
                                CollectionProperties = new List<CollectionProperty>
                                {
                                    collectionProperty
                                }
                            }
                        },
                    },
                    Instance = collectionInstance.Name,
                    Property = collectionProperty.Name,
                    DataType = collectionProperty.DataType
                }).GroupBy(c => c.DataType);

Таким образом, у вас будет две группы, которые были сгруппированы с двойными и строковыми ключами:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...