首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将所有双和字符串数据类型分隔到实例的集合中

如何将所有双和字符串数据类型分隔到实例的集合中
EN

Stack Overflow用户
提问于 2020-03-18 14:44:15
回答 1查看 52关注 0票数 1

这是我的类结构和样本数据,

代码语言:javascript
复制
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; }
}

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

代码语言:javascript
复制
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和所有双重数据类型的集合属性。这个是可能的吗?

代码语言:javascript
复制
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"}
                    }
                }
            }
        };
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-18 15:03:27

在这种情况下,创建一个新的CollectionResult实例并使用LINQ进行属性筛选非常简单。您可以使用Enumerable.Select()创建新实例,只使用Enumerable.Where()筛选双倍实例。

代码语言:javascript
复制
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不同的属性进行筛选的跟踪,这种方法可能很有用。您只需传递一个不同的谓词。

代码语言:javascript
复制
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>对象。

代码语言:javascript
复制
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

代码语言:javascript
复制
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>

代码语言:javascript
复制
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));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60741867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档