这是我的类结构和样本数据,
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,类似于string。在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"}
}
}
}
};发布于 2020-03-18 15:03:27
在这种情况下,创建一个新的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));https://stackoverflow.com/questions/60741867
复制相似问题