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]