我想创建一个像这样的List:
List<int, DateTime> foo = new List<int, DateTime>();
但是我收到了这个错误:
Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments
是否可以在C#中执行此操作?
答案 0 :(得分:9)
您可以拥有一个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);
}
答案 1 :(得分:4)
如果您使用的是.NET 4.0或更高版本,则可以使用List<Tuple<int,DateTime>>
。
另一种方法是创建一个将作为泛型类型的简单类 - 其好处是可读性(为类型和属性提供描述性名称)。
List<MyType> myList = new List<MyType>();
class MyType
{
public int TheInt { get; set; }
public DateTime TheDateTime { get; set; }
}
答案 2 :(得分:4)
这取决于你想做什么。
如果你想使用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();
答案 3 :(得分:1)
List<T>
类型只接受一个泛型类型参数,但您提供两个。如果要在每个插槽中存储两个值,则需要使用可包含两个值的包装类型。例如
class Storage {
public int IntValue { get; set; }
public DateTime DateValue { get; set; }
}
List<Storage> list = ...;
如果您想避免创建自定义类型,也可以使用Tuple<int, DateTime>
答案 4 :(得分:0)
您可以使用在List<T>
内收集的Tuple<int, DateTime>
或KeyValuePair<int, DateTime>
来实现此目的。您收到错误是因为List<T>
包含一个通用参数,因为它存储了一个元素集合(它们都是一个基本类型)。
答案 5 :(得分:0)
为什么不创建一个封装这两个属性的类?
public class Foo
{
public int ID { set;get;}
public DateTime CreatedDate { set;get;}
}
然后您可以创建该类的列表
List<Foo> objFooList=new List<Foo>();
答案 6 :(得分:0)
List<T>
有一个泛型类型参数,而不是List<T, K>
。也许您想要使用Dictionary<TKey, TValue>
代替?
答案 7 :(得分:0)
列表只能包含一种类型。你可以在这里做两件事:
创建元组列表
List<Tuple<int,DateTime>>
使用字典
Dictionary<int, DateTime>