【问题标题】:Multiple parameters in a List. How to create without a class?列表中的多个参数。没有类如何创建?
【发布时间】:2011-05-14 18:04:48
【问题描述】:

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

【问题讨论】:

  • 您确定要列表而不是字典吗?您可能应该就您的实际问题提供更多详细信息,以便清楚您为什么要这样做。
  • 你想用这个列表做什么?
  • 我不要字典。我试图使用一个简单的示例...我将使用两个字符串,它们通过 ASP.NET MVC Controller.Json 以 JSON 格式返回

标签: c# class list


【解决方案1】:

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

List<Tuple<T1, T2>> list;

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

【讨论】:

  • +1,虽然 Tuple 是在 .NET 4 中引入的,所以在 .NET 3.5 中他仍然坚持编写一个类。
  • @David:他在问如何“不创建类”
  • @Jim Schubert:很公平,当然。虽然如果他在可预见的未来使用 3.5,那么 Tuple 类将成为一个方便的可重用实用程序。
  • @Darcy:这个博客有一个用于 .NET 3.5 的 Tuple 实现:amirrajan.net/Blog/tuple
【解决方案2】:

如果您不介意项目是不可变的,您可以使用添加到 .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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • +1 这正是我要建议的,但问题的“参数”部分让我相信他正在寻找两种以上的类型。由于 Dictionary(T,K) 和 List(T) 继承自 IEnumerable 和 ICollection,因此它们的使用方式非常相似。
    • Dictionary&lt;string,Tuple&lt;T1, T2&gt;&gt; myData = new Dictionary&lt;string,Tuple&lt;T1, T2&gt;&gt;(); 在我的案例中我将使用什么来按键获取元组数据
    【解决方案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】:

      List 只接受一种类型参数。 与 List 最接近的是:

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

      【讨论】:

        【解决方案6】:

        为了添加其他建议,我喜欢以下构造,以避免将成员添加到 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[] 成员之类的操作非常方便。

        【讨论】:

          【解决方案7】:

          正如 Scott Chamberlain(和其他几个人)所说,如果您不介意拥有不可变(即只读)对象,则元组效果最好。

          如果像大卫建议的那样,你想通过字符串值引用 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 个元素的元组时使用用户定义的类,您可能会花费更少的时间编写模板参数和更多的时间在非样板代码上

          【讨论】:

            【解决方案8】:

            对于那些想要使用类的人。

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

            创建一个以类为参数的列表

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

            【讨论】:

              【解决方案9】:

              从数据库中获取架构名称和表名称。

                      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;
                      }
              

              【讨论】:

                【解决方案10】:

                这对我来说很好用

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

                【讨论】:

                • 这不是一个好主意,因为字符串本身可能包含 |标志,然后会破坏事物。
                猜你喜欢
                • 1970-01-01
                • 2018-05-01
                • 1970-01-01
                • 2021-12-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多