如何通过列表属性C#将对象拆分为对象列表

时间:2017-08-03 14:46:18

标签: c# .net list split

我有一个对象,其中包含另一个对象的List类型的属性:

public class MyObject {
    public List<AnotherObject> MyProperty { get; set; }
}

MyProperty有几个项目。

我想将MyObject分割为List<MyObject>MyProperty个项目,以便每个MyObject包含MyProperty,只有一个AnotherObjectList<AnotherObject>

怎么做?

3 个答案:

答案 0 :(得分:2)

使用Enumerable.Select获取IEnumerable<MyObject>

var splits = existing.MyProperty.Select(ao => new MyObject {MyProperty = new List<AnotherObject> {ao}});

如果您特别需要List<MyObject>

var asList = splits.ToList();

答案 1 :(得分:1)

我能想到的一种方法是将IClonable接口实现到MyObject类中。这样,您可以创建基础对象的独立副本。 班级MyObject中的所有其他属性都会保留其值!

public class MyObject :ICloneable
{
    public List<AnotherObject> MyProperty { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

然后遍历List<AnotherObject> MyProperty创建副本并覆盖副本中的List对象:

这是一个有效的例子:

MyObject mobj = new MyObject();
mobj.MyProperty = new List<UserQuery.AnotherObject>();
mobj.MyProperty.Add(new AnotherObject());
mobj.MyProperty.Add(new AnotherObject());
mobj.MyProperty.Add(new AnotherObject());
mobj.MyProperty.Add(new AnotherObject());
mobj.MyProperty.Add(new AnotherObject());
mobj.MyProperty.Add(new AnotherObject());


List<MyObject> splitList = new List<MyObject>();

for (int i = 0; i < mobj.MyProperty.Count; i++) 
{   
    // get the reference to the object from the list
    AnotherObject temp = mobj.MyProperty[i];
    // make a deep copy of the base object
    MyObject clone = mobj.Clone() as MyObject;
    // overwrite the internal list and put the reference to the item into the list
    clone.MyProperty = new List<AnotherObject> {temp};
    // add the copied object to the split list
    splitList.Add(clone);
}

请注意,AnotherObject项只是参考!因此,更改基础对象列表中的值将更改副本的单个列表项中的值!

答案 2 :(得分:1)

使用LINQ:

var query = from p in obj.MyProperty
            select new MyObject() { MyProperty = new List<AnotherObject>() { p } };