这可能是一个非常明显的问题,但是如何在不创建类的情况下创建具有多个参数的List
。
示例:
var list = new List<string, int>();
list.Add("hello", 1);
我通常会使用这样的类:
public class MyClass
{
public String myString {get; set;}
public Int32 myInt32 {get; set;}
}
然后通过执行以下操作创建我的列表:
var list = new List<MyClass>();
list.Add(new MyClass { myString = "hello", myInt32 = 1 });
答案 0 :(得分:75)
如果您使用的是.NET 4.0,则可以使用Tuple
。
List<Tuple<T1, T2>> list;
对于旧版本的.NET,您必须创建一个自定义类(除非您足够幸运,能够找到适合您在基类库中的需求的类)。
答案 1 :(得分:22)
如果您不介意项目是不可变的,您可以使用添加到.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
答案 2 :(得分:6)
如果合适,您可以使用也是通用集合的Dictionary:
Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("string", 1);
答案 3 :(得分:4)
List只接受一个类型参数。 你最接近List的是:
var list = new List<Tuple<string, int>>();
list.Add(Tuple.Create("hello", 1));
答案 4 :(得分:4)
另一种解决方案创建匿名类型的通用列表。
var list = new[]
{
new { Number = 10, Name = "Smith" },
new { Number = 10, Name = "John" }
}.ToList();
foreach (var item in list)
{
Console.WriteLine(item.Name);
}
这也为您提供intellisense
支持,我认为在某些情况下它比Tuple
和Dictionary
更好。
答案 5 :(得分:3)
添加其他建议我喜欢以下构造,以避免将成员添加到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#本身并不真正支持元组类型所以这个小黑客可以创造奇迹。
如果您发现自己确实需要超过2个,我建议创建针对元组类型的抽象。(虽然Tuple
是一个类而不是类似KeyValuePair
的结构,但这是一个有趣的区别。)
奇怪的是,初始化列表语法可以在任何IEnumerable
上使用,它允许您使用任何Add
方法,即使是那些实际上不能被您的对象枚举的方法。允许添加object[]
成员作为params object[]
成员等内容非常方便。
答案 6 :(得分:1)
如果像David建议的那样,你想通过字符串值引用int,例如,你应该使用字典
Dictionary<string, int> d = new Dictionary<string, int>();
d.Add("string", 1);
Console.WriteLine(d["string"]);//prints 1
但是,如果您希望将元素可变地存储在列表中,并且不想使用字典样式的引用系统,那么您最好的选择(即现在只有真正的解决方案)就是使用KeyValuePair,对于C#来说,它本质上是std :: pair:
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
很明显,如果你这样做,你应该也可以定义一个辅助功能。
我的建议是,如果你的元组包含2个以上的元素,请定义自己的类。您可以使用typedef-esque using语句,如:
using quad = KeyValuePair<KeyValuePair<int,string>, KeyValuePair<int,string>>;
但这并不会使您的实例化变得更容易。如果在处理超过2个元素的元组时使用用户定义的类,则可能花费更少的时间编写模板参数和更多时间在非样板代码上
答案 7 :(得分:1)
从数据库中获取架构名称和表名称。
public IList<Tuple<string, string>> ListTables()
{
DataTable dt = con.GetSchema("Tables");
var tables = new List<Tuple<string, string>>();
foreach (DataRow row in dt.Rows)
{
string schemaName = (string)row[1];
string tableName = (string)row[2];
//AddToList();
tables.Add(Tuple.Create(schemaName, tableName));
Console.WriteLine(schemaName +" " + tableName) ;
}
return tables;
}
答案 8 :(得分:0)
对于那些想要使用班级的人。
使用您想要的所有参数创建一个类
使用类作为参数
创建一个列表
day1 + day2 + day3
答案 9 :(得分:-2)
这适用于我
List<string> myList = new List<string>();
myList.Add(string.Format("{0}|{1}","hello","1") ;
label:myList[0].split('|')[0]
val: myList[0].split('|')[1]