【问题标题】:Using Linq ConvertAll to create a backup of a list before altering the list在更改列表之前使用 Linq ConvertAll 创建列表的备份
【发布时间】:2018-10-09 05:00:57
【问题描述】:

我正在做一个项目,我有一个包含嵌套列表的对象列表,我想在更新原始列表之前对其进行备份。

我很接近,但我找不到正确的语法,所以我希望你能在这里帮助我。

这是原来的类:

public class TeamClass
{
     public string Country { get; set; }
     public string CountryCode { get; set; }
     public List<double> Points { get; set; }
}

List<TeamClass> originalList = new List<TeamClass>();

就在我更新 OriginalList 上的点之前,我想创建 OriginalList 的深层副本,以便“撤消”更改。

目前我正在使用以下代码:

 var backupList = Simulation.ConvertAll(x => new TeamClass
 {
     Country = x.Country,
     CountryCode = x.CountryCode,
     Points = new List<double>(x.Points.ConvertAll(p => new double()))
 })
 .OrderByDescending(o => o.Points.Sum())
 .ToList();

虽然此代码创建了原始列表的深层副本,但它将列表 Points 中的所有点替换为 0(因为新的 double())

但是使用

Points = x.Points

给了我正确的分数,但是当原始列表更新时它们也会更新。

我想我必须做一些类似的事情

Points = new List<double>().AddRange(x.Points)

但我找不到正确的语法。

感谢任何帮助。

【问题讨论】:

  • 为什么不只是Points = new List&lt;double&gt;(x.Points)
  • 这么简单啊...当它变得如此简单时,这很烦人... :-) 谢谢@SamiKuhmonen
  • 我可以再问一个问题吗?我怎样才能只复制特定数量的条目?所以总共有 7 个条目在列表 Points 中。如果我只想将前 4 个值复制到新列表中,而将其他 3 个值留空。我怎么能这样做?
  • 对于您的其他问题,您可以将之前的答案修改为Points = new List&lt;double&gt;(x.Points.Take(4))
  • 感谢您的回复@KamilFolwarczny,但这仅向我展示了前 4 个,这是一个好的开始,但我想拥有原始列表的前 4 个值并拥有剩余的项目在列表中为 0。列表的大小应始终保持不变。这可能吗?

标签: c# linq convertall


【解决方案1】:

回答您来自 cmets 的其他问题。可以通过这样的方式完成。

 int N = 4; // Number of desired elements with value
 var backupList = Simulation.ConvertAll(x => new TeamClass
 {
     Country = x.Country,
     CountryCode = x.CountryCode,
     Points = new List<double>(x.Points.Take(N).Concat(x.Points.Skip(N).ToList().ConvertAll(p => new double())));
 })
 .OrderByDescending(o => o.Points.Sum())
 .ToList();

由于 double 不是可为空的数据类型,N 之后的所有值都将被转换为 0。

【讨论】:

  • 乐于助人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
相关资源
最近更新 更多