【问题标题】:Create a List of int & DateTime创建一个 int 和 DateTime 列表
【发布时间】:2012-02-02 12:21:11
【问题描述】:

我想创建一个这样的列表:

List<int, DateTime> foo = new List<int, DateTime>();

但我收到此错误:

Using the generic type 'System.Collections.Generic.List&lt;T&gt;' requires 1 type arguments

在 C# 中可以做到这一点吗?

【问题讨论】:

标签: c# .net list


【解决方案1】:

你可以有一个int/DateTime Tuples的列表。

var foo = new List<Tuple<int, DateTime>>();

这确实需要 .Net 4.0+。

我个人更喜欢创建一个简单的类并将其用于我的列表。我认为它比嵌套泛型更具可读性。

// I don't know your domain so the example is with names I'd hate to actually see
class MyType
{
    public int MyInteger {get; set;}
    public DateTime MyDateTime {get; set;}
}

也可以使用dynamic 并发送一个匿名类型。

var foo = new List<dynamic>();

foo.Add(new {X = 0, D = DateTime.Now});

foreach(var d in foo)
{
    Console.WriteLine(d);
}

【讨论】:

    【解决方案2】:

    如果您使用的是 .NET 4.0 或更高版本,则可以使用 List&lt;Tuple&lt;int,DateTime&gt;&gt;

    另一种方法是创建一个用作泛型类型的简单类 - 这样做的好处是可读性(为类型和属性提供描述性名称)。

    List<MyType> myList = new List<MyType>();
    
    class MyType
    {
       public int TheInt { get; set; }
       public DateTime TheDateTime { get; set; }
    }
    

    【讨论】:

      【解决方案3】:

      列表只能包含一种类型。你可以在这里做两件事:

      1. 创建一个元组列表

        List&lt;Tuple&lt;int,DateTime&gt;&gt;

      2. 使用字典

        Dictionary&lt;int, DateTime&gt;

      【讨论】:

        【解决方案4】:

        List&lt;T&gt; 类型只接受一个泛型类型参数,但您提供了两个。如果要在每个插槽中存储两个值,则需要使用可以包含这两个值的包装器类型。例如

        class Storage {
          public int IntValue { get; set; }
          public DateTime DateValue { get; set; }
        }
        
        List<Storage> list = ...;
        

        如果您不想创建自定义类型,也可以使用Tuple&lt;int, DateTime&gt;

        【讨论】:

          【解决方案5】:

          这取决于你想做什么。

          例如,如果您想使用 int 作为索引来访问 DateTime,您可以使用 Dictionary,如下所示:

          Dictionary<int, DateTime> dict = new Dictionary<int, DateTime>();
          
          dict.Add(1, DateTime.Now);
          DateTime d = dict[1];
          

          或者,如果您想存储任意值列表并允许重复,您可以使用:

            var values = new List<Tuple<int, DateTime>>();
            values.Add(new Tuple<int, DateTime>(1, DateTime.Now));
            Tuple<int, DateTime> value = values.First();
          

          【讨论】:

            【解决方案6】:

            它是带有一个泛型类型参数的 List&lt;T&gt;,而不是 List&lt;T, K&gt;。也许您想改用Dictionary&lt;TKey, TValue&gt;

            【讨论】:

              【解决方案7】:

              为什么不创建一个封装这两个属性的类?

              public class Foo
              {
               public int ID { set;get;}
               public DateTime CreatedDate { set;get;}
              
              }
              

              然后您可以创建该类的列表

               List<Foo> objFooList=new List<Foo>();
              

              【讨论】:

                【解决方案8】:

                您可以使用Tuple&lt;int, DateTime&gt;KeyValuePair&lt;int, DateTime&gt; 来实现此目的,收集在List&lt;T&gt; 中。您收到错误是因为 List&lt;T&gt; 包含一个通用参数,因为它存储了一个元素集合(它们都是一种基本类型)。

                【讨论】:

                  猜你喜欢
                  • 2013-08-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-12-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多