C#中的列表中的多个参数。 如何创build没有类?

这可能是一个非常明显的问题,但我将如何创build一个具有多个参数的List而不创build类。

例:

 var list = new List<string, int>(); list.Add("hello", 1); 

我通常会使用类如下:

 public class MyClass { public String myString {get; set;} public Int32 myInt32 {get; set;} } 

然后创build我的列表,

 var list = new List<MyClass>(); list.Add(new MyClass { myString = "hello", myInt32 = 1 }); 

如果您使用.NET 4.0,则可以使用Tuple

 List<Tuple<T1, T2>> list; 

对于较旧版本的.NET,您必须创build一个自定义类(除非您足够幸运能够在基类库中find适合您需要的类)。

如果您不介意项目不可变,您可以使用添加到.net 4的Tuple类

 var list = new List<Tuple<string,int>>(); list.Add(new Tuple<string,int>("hello", 1)); list[0].Item1 //Hello list[0].Item2 //1 

但是,如果你每次添加两个项目,其中一个是唯一的ID,你可以使用一个字典

如果合适的话,你可以使用一个也是通用集合的Dictionary:

 Dictionary<string, int> d = new Dictionary<string, int>(); d.Add("string", 1); 

列表只接受一个types参数。 与List最接近的是:

  var list = new List<Tuple<string, int>>(); list.Add(Tuple.Create("hello", 1)); 

要添加到其他build议我喜欢以下结构,以避免恼人的keyvaluepair集合中添加成员。

 public class KeyValuePairList<Tkey,TValue> : List<KeyValuePair<Tkey,TValue>>{ public void Add(Tkey key, TValue value){ base.Add(new KeyValuePair<Tkey, TValue>(key, value)); } } 

这意味着可以使用更好的语法来初始化构造函数::

 var myList = new KeyValuePairList<int,string>{{1,"one"},{2,"two"},{3,"three"}}; 

我个人更喜欢上面的代码更详细的例子不幸的是,C#本质上并不真正支持元组types,所以这个小小的黑客可以创造奇迹。

如果你发现自己真的需要超过2个,我build议创build对元组types的抽象(尽pipeTuple是一个不像KeyValuePair这样的结构,这是一个有趣的区别)。

奇怪的是,初始化列表语法在任何IEnumerable上都可用,它允许您使用任何Add方法,即使那些实际上并不能被对象枚举的方法。 允许像添加一个object[]成员作为params object[]成员这样的事情是非常方便的。

正如斯科特·张伯伦(和另外几个人)所说的,如果你不介意拥有不可变的(即只读)对象,Tuples的工作效果最好。

如果像Davidbuild议的那样,你想要通过string值来引用int,例如,你应该使用一个字典

 Dictionary<string, int> d = new Dictionary<string, int>(); d.Add("string", 1); Console.WriteLine(d["string"]);//prints 1 

但是,如果你想要在列表中可变地存储你的元素,而不想使用字典式的引用系统,那么你最好的select就是使用KeyValuePair,它本质上是std :: pair for C#:

 var kvp=new KeyValuePair<int, string>(2, "a"); //kvp.Key=2 and a.Value="a"; kvp.Key = 3;//both key and kvp.Value = "b";//value are mutable 

当然,这是可堆叠的,所以如果你需要一个更大的元组(比如如果你需要4个元素),你可以将它堆叠起来。 当然,这真的很难看:

  var quad=new KeyValuePair<KeyValuePair<int,string>, KeyValuePair<int,string>> (new KeyValuePair<int,string>(3,"a"), new KeyValuePair<int,string>(4,"b")); //quad.Key.Key=3 

所以显然,如果你这样做,你应该也可以定义一个辅助function。

我的build议是,如果你的元组包含2个以上的元素,定义你自己的类。 你可以使用typedef-esque使用语句,如:

 using quad = KeyValuePair<KeyValuePair<int,string>, KeyValuePair<int,string>>; 

但是这并不会让你的实例更容易。 如果使用用户定义的类处理超过2个元素的元组时,您可能会花更less的时间来编写模板参数,并花更多时间在非模板代码上

对于那些想要使用一个类。

用你想要的所有参数创build一个类

创build一个类作为参数的列表

 class MyClass { public string S1; public string S2; } List<MyClass> MyList= new List<MyClass>(); 

这对我很好

 List<string> myList = new List<string>(); myList.Add(string.Format("{0}|{1}","hello","1") ; label:myList[0].split('|')[0] val: myList[0].split('|')[1]