一份优秀的 C# 集合

7

在C#中,用什么好的集合来存储下面的数据:

我有复选框,每个复选框都带有一个 subjectId、varnumber、varname 和与其关联的标题。

我需要一个可以任意大小的集合,可能是 ArrayList,也可能:

      list[i][subjectid] = x;
      list[i][varnumber] = x;
      list[i][varname] = x;
      list[i][title] = x;

有什么好的想法吗?

8个回答

14

一个List<Mumble>,其中Mumble是一个小助手类,用于存储属性。

List<Mumble> list = new List<Mumble>();
...
var foo = new Mumble(subjectid);
foo.varnumber = bar;
...
list.Add(foo);
,..
list[i].varname = "something else";

1
有关Mumble类的帮助,请参见下文。 - chris

7
public Class MyFields
{
    public int SubjectID { get; set; }        
    public int VarNumber { get; set; }
    public string VarName { get; set; }
    public string Title { get; set; }
}

var myList = new List<MyFields>();

访问成员:

var myVarName = myList[i].VarName;

1
一个通用的列表,List<YourClass> 将会很棒 - 其中 YourClass 具有 subjectid、varnumber 等属性。

0

由于这是一个键值对,我建议您使用基于泛型的IDictionary集合。

// Create a new dictionary of strings, with string keys, 
// and access it through the IDictionary generic interface.
IDictionary<string, string> openWith = 
    new Dictionary<string, string>();

// Add some elements to the dictionary. There are no 
// duplicate keys, but some of the values are duplicates.
openWith.Add("txt", "notepad.exe");
openWith.Add("bmp", "paint.exe");
openWith.Add("dib", "paint.exe");
openWith.Add("rtf", "wordpad.exe");

字典无法完全解决问题,因为subjectid和varnumbers都作为唯一主键绑定在一起,所以你不能使用相同的主题键创建dictSubject字典(这就是我遇到的问题)。 - chris
我通常使用Hans方法,因为它允许您对整个集合进行强类型化,这可能是最好的选择。然后,您可以使用枚举来表示键。 - Frazell Thomas

0

如果[i]的顺序不可预测,或者可能存在间隔,但您需要将其用作键,则有一种微小的可能性:

public class Thing
{
    int SubjectID { get; set; }        
    int VarNumber { get; set; }
    string VarName { get; set; }
    string Title { get; set; }
}

Dictionary<int, Thing> things = new Dictionary<int, Thing>();
dict.Add(i, thing);

然后要找到一个Thing

var myThing = things[i];

0

针对这个问题,你可能想要使用 二维数组,并在数组的第二维中为每个值分配位置。例如,list[i][0] 将是 subjectidlist[i][1] 将是 varnumber,以此类推。


第一维度能否自由增长和缩小,还是必须事先分配特定的大小? - chris
4
不要使用"魔法数字",它们会让你在六个月后调试时感到非常糟糕。请注意,"魔法数字"指的是编程中硬编码的未解释数字,在代码中出现多次,难以维护和修改。 - Michael Todd
这不是一个很好的解决方案,因为索引是弱类型的(即您必须知道索引0是subjectid)。 - Alan
我目前不太了解C#,但我认为您必须提前分配特定大小。不过,如果需要,可以通过某些方式更改数组的长度。 - Elliot Bonneville
看起来好像不需要二维数组,因为第二个维度看起来像是类的属性,所以所有属性都通过组在第一个维度上相关联,而不是按位置相关联。这也可能有所帮助:http://colinmackay.co.uk/blog/2010/09/09/tip-of-the-day-19-create-a-list-of-objects-instead-of-many-lists-of-values/ - Colin Mackay
啊,好吧,那就不要理我了。就像我说的,我绝对不熟悉C#。 - Elliot Bonneville

0

确定集合的选择通常始于您想要使用它做什么?

如果您唯一的标准是它可以是任何大小,那么我会考虑使用List<>


0
如其他人所说,看起来你最好创建一个类来保存这些值,这样你的列表返回包含所有需要的数据的对象。虽然二维数组可能有用,但这不是其中之一。
要了解更好的解决方案以及为什么在这种情况下使用二维数组/列表不是一个好主意,您可能需要阅读:创建一个对象列表,而不是许多值列表

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接