В этой ситуации было бы просто создать новый экземпляр 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));