【问题标题】:Retrieving field data from a List of class objects从类对象列表中检索字段数据
【发布时间】:2013-03-06 05:12:03
【问题描述】:

我最终尝试存储顶点数据:x、y、z。我正在比较两种不同的集合类型来存储数据:List<T>Dictionary<K,V>。两者都包含相同的公共类数据。注意差异;我的列表使用了一个构造函数(我稍后会添加到列表中),我的 dict 使用一种方法添加到 dict:

我的清单

class Node1: List<Node1>
{
    public int nid;
    public double x, y, z;
    public Node1() {}
    public Node1(string strLine)
    {
        nid = int.Parse(strLine.Substring(8, 8));
        x = double.Parse(strLine.Substring(24, 8));
        y = double.Parse(strLine.Substring(32, 8));
        z = double.Parse(strLine.Substring(40, 8));
    }
}

还有这个……字典

public struct loc
{
    public double x, y, z;
}
public class Node2: Dictionary<int,loc>
{
    public int nid;
    public void Add(string strLine)
    {
        // collect the dictionary KEY
        nid = int.Parse(strLine.Substring(8, 8));
        // collect the dictionary VALUE
        loc data;
        data.x = double.Parse(strLine.Substring(24, 8));
        data.y = double.Parse(strLine.Substring(32, 8));
        data.z = double.Parse(strLine.Substring(40, 8));
        this.Add(nid, data);
    }
}

在我的主目录中,我读入了一个带有顶点数据的文本文件并执行以下操作(很多内容已被删除):

var Nodes1 = new Node1();
var Nodes2 = new Node2();

string strLine;

Nodes1.Add(new Node1(strLine));
Nodes2.Add(strLine);

现在两个集合都包含相同的数据。

现在问题来了。我正在寻找具有等于 1001 的 int“nid”的类的特定实例,并且我想找到相应的双精度“x”的值。为了稍微澄清一下(因为我只是把自己弄糊涂了),我可以通过执行以下操作来检查是否存在包含 nid=1001 的实例:

// does the entry exist - LIST
bool here1 = Nodes1.Exists(var => var.nid == 1001);

// does the entry exist - DICTIONARY
bool here2 = Nodes2.ContainsKey(1001);

要从包含 nid=1001 的对象中获取双“x”(对于字典),我这样做:

double here3 = Nodes2[1001].x;

但我不知道如何从 List 集合中获取数据。也许是因为 List 集合不是为此目的而设计的。但是,如果可能的话,我如何从列表中得到相同的结果?

也许有人可以解释另一种(更好的)方法来做到这一点?我仍然不太了解为什么/何时使用 LIST 和 DICTIONARY 集合,因为似乎有 100 种方法可以做同样的事情。

【问题讨论】:

  • 好吧,如果你想通过它的键获取一个值(即顶点数据),那么字典听起来是更好的解决方案。当我对值的位置/顺序感兴趣时,我倾向于使用列表。也就是说,您确定要 Node1 从自身的 List 继承吗?
  • @Corak。显然不是。我的一个尝试似乎使自己的空白列表无限循环,哎呀。使用 Dict 似乎是一种更整洁的方式。还有一个可能是我还没有想到的更好的方法。
  • 通常不需要从 List 或 Dictionary 继承。只需按原样使用这些类。 Dictionary&lt;int, loc&gt; node = new Dictionary&lt;int, loc&gt;(); 然后node[1001] = someLoc;
  • 我考虑过只使用字典。那么为什么存在该选项(例如:公共类 Node2:Dictionary)?仅单独使用字典是否有特定目的?我使用它的原因是因为我的 Node2 类有很多我没有分享的方法。如果我只使用 Dictionary 而不是一个类,那么我会有很多公共静态方法。
  • 从一个类继承你说派生类与父类基本相同,但有一些额外的功能。所以如果你的Node 基本上是一个Dictionary&lt;int, loc&gt; 多一点,那么它没有错。但是为什么您需要在字典中使用 public int nid 呢?为什么字典负责解释字符串行?看起来你想要一个更大的class Loc,它包含 one 行的所有数据,知道如何读取一行,也许写它等等,然后使用 Dictionary 来存储该类的对象。

标签: c# list collections dictionary


【解决方案1】:
        int index = Nodes1.FindIndex(var => var.nid == 1001);
        double here4 = Nodes1[index].x;

【讨论】:

  • 这回答了我的两个问题。 1)如何做到这一点,2)它需要更多的代码来做到这一点,而且 Dict 是更干净的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多