如何替换通用列表中每个实例的交换 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 个属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 2 个属性从我的 App Store 版本交换到我当前的开发版本?

如何在 angularJS 中交换视图?

为啥列表元素不交换?

js交换数组中2个元素的位置,实现排序功能

交换列表中元素的更好方法?

多层交换机的多层交换机的体系结构