【问题标题】:LINQ retains unwanted data bindingLINQ 保留不需要的数据绑定
【发布时间】:2014-09-12 08:39:20
【问题描述】:

让我们创建一个名为 i_Changes 的变量,其类型为 List<List<int>>,它具有以下值:

[1] = 1,2
[2] = 3,4,6
[3] = 4,8,15

此变量存储在类 myClass 中,如下所示:

Public Class myClass
{
    public DateTime selectedDate {get; set}
    public List<List<int>> i_Changes {get;set;}
}

现在我们有了另一个名为 i_Holder 的变量,其类型为 List&lt;List&lt;List&lt;int&gt;&gt;&gt;,它应该保存 i_Changes 的值(这意味着在每次迭代之后,我想存储来自 i_Changes 的确切数字,以便以后(在处理之后) 我可以将它们全部显示给网格中的用户。

每次迭代后我要存储新变量的操作如下:

i_Holder.Add(myClass.Select(n=>n.i_Changes).ToList();

我发现当我像这样向列表中添加项目时,它们会一直与原始 i_Changes 绑定,这意味着在每次迭代之后(当 i_Changes 下的值发生变化时),i_Holder 下的所有值相应地更改 -> 这意味着我有 n 个具有完全相同值的项目列表,例如当前 i_Changes

我该如何解决这个问题?

另外,如果您认为 List&lt;List&lt;List&lt;int&gt;&gt;&gt; 不是一个好主意,请随时纠正我,因为这是我唯一能想到的。

谢谢

编辑: 我发现当我创建新的List&lt;List&lt;int&gt;&gt; 并将每个值手动复制到该列表时,绑定就会丢失;但是我认为这不是最好的做法(每次迭代后创建新列表)。有没有更好的方法来做到这一点?

【问题讨论】:

  • 请为您的问题分享更多代码。
  • 执行该操作的代码有 600 多行。在迭代结束时,我正是这样做的(向列表中添加新值),所以实际上没有其他相关代码
  • 对于i_Holder,我建议你使用List&lt;int&gt;。和i_Holder=i_Holder.Contact(myClass.SelectMany(n=&gt;n.i_Changes).ToList());
  • .Contact 代表什么?我在 LINQ 命令中找不到它;如果我没记错的话,Select many 也会简单地将结果放在一维数组中;但我需要保留数组的结构
  • 你的示例代码真的很奇怪:i_Holder.Add(myClass.Select(n=&gt;n.i_Changes).ToList(); 首先它不能编译,其次如果myClassmyClass 的一个实例,你不能在它上面做一个Select:这不是IEnumerable&lt;myClass&gt;

标签: c# linq list


【解决方案1】:

您持有对同一对象的引用列表,因此当对象更改时,您将在列表中的每个项目中看到该更改。

您需要每次创建一个包含所需值的新列表,如下所示:

i_Holder.Add(myClass
    .Select(n => n.i_Changes.Select(j => new List<int>(j)).ToList()).ToList());

【讨论】:

  • 成功了,谢谢!但是,您认为每次都创建新列表是一种好习惯吗?我不应该为此目的创造一些不同的东西吗?还是采用不同的方法?
  • 嗯.. 你需要复制所有的int 值,所以使用新的List 可能并不比任何其他方法差!
【解决方案2】:

在 C# 中,列表是通过引用传递的,所以我认为这就是您遇到此问题的原因。为了避免这种情况,您必须在添加列表之前对列表进行深层复制。

您可以阅读列表的深度克隆here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多