C#中列表中的多个参数。如何在没有课程的情况下创作?

时间:2010-11-23 21:29:52

标签: c# class list

这可能是一个非常明显的问题,但是如何在不创建类的情况下创建具有多个参数的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 });

10 个答案:

答案 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支持,我认为在某些情况下它比TupleDictionary更好。

答案 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)

正如Scott Chamberlain(以及其他几个人)所说,如果您不介意使用不可变(即只读)对象,则元组效果最佳。

如果像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]