как отделить все типы данных типа double и string в коллекцию Instance - PullRequest
1 голос
/ 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; }
}

============================ ================================================== ================

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

Теперь на основе DataType я хочу выделить, как показано ниже. Пример Double, похожий на строку. В collectionResult мне нужно добавить Asset и все свойства сбора двойного типа данных из разных экземпляров. Это возможно?

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

1 Ответ

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

В этой ситуации было бы просто создать новый экземпляр CollectionResult и выполнить фильтрацию свойств с помощью LINQ. Вы можете создавать новые экземпляры с Enumerable.Select() и фильтровать только удваивает с Enumerable.Where():

var doubleCollection = new CollectionResult
{
    Asset = collectionResult.Asset,
    Instances = collectionResult.Instances.Select(x => new Instance { 
        Name = x.Name, 
        CollectionProperties = x.CollectionProperties.Where(cp => cp.DataType == "Double").ToList() 
    }).ToList()
};

Вы также можете создать метод для фильтрации по Func<CollectionProperty, bool> селектор предикатов. Этот подход может быть полезен, если вы решили, что хотите отфильтровать по другому свойству из CollectionProperty. Вы можете просто передать другой предикат.

private static CollectionResult FilterCollectionByProperty(CollectionResult collectionResult, Func<CollectionProperty, bool> selector)
{
    return new CollectionResult
    {
        Asset = collectionResult.Asset,
        Instances = collectionResult.Instances.Select(x => new Instance
        {
            Name = x.Name,
            CollectionProperties = x.CollectionProperties.Where(selector).ToList()
        }).ToList()
    };
}

И создать оба CollectionResult объекта отдельно или в IEnumerable<CollectionResult>:

var types = new List<string> { "Double", "String" };

// Separate collections
var doubleCollection = FilterCollectionByProperty(collectionResult, x => x.DataType == "Double");
var stringCollection = FilterCollectionByProperty(collectionResult, x => x.DataType == "String");

// List of collections
var collectionList = types.Select(t => FilterCollectionByProperty(collectionResult, x => x.DataType == t));

Другой альтернативой является передача и фильтрация. непосредственно DataType, тогда вам не нужно передавать предикат Func<CollectionProperty, bool>. Недостатком является то, что метод установлен для фильтрации только по DataType.

private static CollectionResult FilterCollectionByDataType(CollectionResult collectionResult, string dataType)
{
    return new CollectionResult
    {
        Asset = collectionResult.Asset,
        Instances = collectionResult.Instances.Select(x => new Instance
        {
            Name = x.Name,
            CollectionProperties = x.CollectionProperties.Where(cp => cp.DataType == dataType).ToList()
        }).ToList()
    };
}

Которые также можно создавать в виде отдельных CollectionResult объектов или IEnumerable<CollectionResult>:

var types = new List<string> { "Double", "String" };

// Separate collections
var doubleCollection = FilterCollectionByDataType(collectionResult, "Double");
var stringCollection = FilterCollectionByDataType(collectionResult, "String");

// List of collections
var collectionList = types.Select(t => FilterCollectionByDataType(collectionResult, t));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...