【问题标题】:List not copying into a struct列表不复制到结构中
【发布时间】:2015-09-26 15:13:08
【问题描述】:

所以我有这个结构

public struct Way
    {
        public Int64 ID;
        public List<Int64> Ref; //contains a list with Node IDs
        public List<string> Tag;
        public List<string> Value;

        public Way(Int64 id, List<Int64> refe, List<string> tage, List<string> valuee)
        {
        ID = id;
        Ref = new List<Int64>(refe); //contains a list with Node IDs
        Tag = new List<string>(tage);
        Value = new List<string>(valuee); // This list is ALWAYS the same lenght as the Tag list
        }

    };

此结构用作基本模板,用于存储从大文件中检索到的数据。所以我创建了一个这个结构的列表来存储所有的数据。

public List<Way> WayList = new List<Way>();

在处理算法中,我使用一个临时结构来临时存储每个数据,同时逐行处理文件(1 路的数据可以跨越 4 行到 800-1000 行文本或更多)。

List<Int64> a = new List<Int64>();
List<string> b = new List<string>();
List<string> c = new List<string>();
Way FoundWay = new Way(0, a, b, c);

然后我使用 Add 函数将这个临时结构添加到列表中。

 WayList.Add(CopyWay);

在调试模式下会发生这种情况。临时结构中包含正确的数据。但是当我将此结构添加到 WayList 中时,就会发生这种情况:

    - the ID gets input by value (each way in the list has an unique ID = good)
    - the lists gets input by reference ( each way in the list has the same lists = bad)

我的问题是,有没有办法按值获取这些列表输入,还是我需要放弃使用结构?

【问题讨论】:

标签: c# list struct


【解决方案1】:

这可能不应该是一个结构。它似乎更“自然”成为一个类,尽管可能有理由使用这里不明显的结构(尽管可变结构是一件危险的事情,最好只非常小心地使用结构本身privateinternal 以便可变结构的许多复杂性不会导致问题)。

不管怎样:

列表通过引用获取输入

不完全是。列表按值输入,但该值本身就是一个引用,因为List&lt;T&gt; 是一个引用类型。如果你想创建一个列表的副本,你必须这样做; 复制列表。这决定了包含对象是引用类型还是值类型。

一个简单的方法是添加一个复制构造函数:

public Way (Way way)
  : this(way.ID, new List<Int64>(way.Ref), new List<string>(way.Tag), new List<string>(way.Value))
{
}

然后使用它:

WayList.Add(new Way(CopyWay));

【讨论】:

  • 这个结构体的使用方式只是设置它,然后它将纯粹用于从(主要是数据库类型)读取数据。 struct 的原因基本上是我被教导关于 struct 和 class 之间区别的方式。结构是一组不同类型的变量,而一个类对变量进行分组,并且还具有以某种方式使用/更改数据的功能。无论如何,这个修复帮助了我,谢谢。
  • 谁教你结构和类之间的区别是非常非常错误的。或者是在教你关于 C# 以外的语言。 (如果他们教你 C++,那么他们只会大错特错,而不是大错特错)。
  • 在 C++ 中,structclass 的区别在于 struct 默认情况下所有内容都是公开的,而 class 默认情况下是私有的;这是私有默认情况下作为 OOP 偏好但需要与 C 兼容的遗留问题。使用 struct 作为变量分组和使用 class 作为更详细的成员是常见,但是例外可能有充分的理由。在 C# 中,struct 创建一个值类型,class 创建一个引用类型,因此两者之间的差异与 C++ 中的差异很大。
猜你喜欢
  • 2022-01-06
  • 2010-11-16
  • 2012-10-07
  • 1970-01-01
  • 2012-09-25
  • 2012-02-25
  • 2019-02-08
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多