我有一个对象,其中包含另一个对象的List
类型的属性:
public class MyObject {
public List<AnotherObject> MyProperty { get; set; }
}
MyProperty
有几个项目。
我想将MyObject
分割为List<MyObject>
个MyProperty
个项目,以便每个MyObject包含MyProperty
,只有一个AnotherObject
为List<AnotherObject>
。
怎么做?
答案 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 } };