如何替换通用列表中每个实例的交换 2 个属性?
Posted
技术标签:
【中文标题】如何替换通用列表中每个实例的交换 2 个属性?【英文标题】:How to replace swap 2 properties for each instance inside a generic List? 【发布时间】:2021-12-28 00:12:32 【问题描述】:如何在通用列表中交换每个实例的 2 个属性。更好地解释:
对于该列表中的所有 A 实例,我希望 BInstance1 变为 BInstance2,BInstance2 变为 BInstance1:
我很确定我应该使用 Select linq 扩展方法,但我不太了解它的语法
public class A
public B BInstance1 get; set;
public B BInstance2 get; set;
public class B
public int Id get; set;
public string Name get; set;
public DateTime Created get; set;
var aList = new List<A>();
aList.Add(new A()
BInstance1 = new B() Created = DateTime.Now.Add(new TimeSpan(1, 0, 0, 0)), Id = 1, Name = "B1" ,
BInstance2 = new B() Created = DateTime.Now.Add(new TimeSpan(2, 0, 0, 0)), Id = 2, Name = "B2"
);
aList.Add(new A()
BInstance1 = new B() Created = DateTime.Now.Add(new TimeSpan(3, 0, 0, 0)), Id = 3, Name = "B3" ,
BInstance2 = new B() Created = DateTime.Now.Add(new TimeSpan(4, 0, 0, 0)), Id = 4, Name = "B4"
);
【问题讨论】:
【参考方案1】:如果您想将此逻辑封装为类的一部分。然后你可以做这样的事情
public class A
public B BInstance1 get; set;
public B BInstance2 get; set;
// deconstruction tuple swap
public void Swap() => (BInstance1, BInstance2) = (BInstance2, BInstance1);
用法
var aList = new List<A>();
aList.Add(new A()
BInstance1 = new B() Created = DateTime.Now.Add(new TimeSpan(1, 0, 0, 0)), Id = 1, Name = "B1" ,
BInstance2 = new B() Created = DateTime.Now.Add(new TimeSpan(2, 0, 0, 0)), Id = 2, Name = "B2"
);
foreach (var item in aList)
item.Swap();
注意:显然,这不需要是类的一部分,它可以是扩展方法、辅助方法或任何其他变体,例如用于行
注意 2 :如果您想要一个新分配的列表和原始对象的克隆,您将需要投影 (Select
) 并手动(或通过其他方式)分别重新创建对象
【讨论】:
使用元组解构来交换属性是作弊!我们不得不使用过去美好时光的临时变量在哪里?... @TheodorZoulias 它的新热点 :) 临时变量消失了!以上是关于如何替换通用列表中每个实例的交换 2 个属性?的主要内容,如果未能解决你的问题,请参考以下文章