2011-08-03 214 views
0

我使用下面的代码:更改ArrayList的仿制

  var list = new Collection<ArrayList> 
         { 
          new ArrayList 
           { 
            1, 
            "Test1" 
           }, 
          new ArrayList 
           { 
            2, 
            "Test2" 
           }, 
         }; 

在上面的代码中,我想避免的ArrayList和使用泛型。在上面的代码中可能吗?

编辑: 上面我在一个数组列表对象中只使用了两个值,我可能在其中有多个int和字符串。

+0

你应该用自定义'class' /'struct' /'组<>'/等取代你'ArrayList's。它会更可读。 – dlev

回答

5

您不能在通用列表中混合类型(除非泛型类型为object,但这相当于ArrayList并且只是泛型的变体)。

但是,您可以创建一个包含stringint的类,并将其用作通用列表的通用参数。

public class MyClass 
{ 
public MyString string { get; set; } 
public MyInt int { get; set; } 
} 

var list = new Collection<MyClass> 
      { 
      new MyClass { MyInt = 1, MyString = "Test1" }, 
      new MyClass { MyInt = 2, MyString = "Test2" } 
      } 

另一种选择,如果使用.NET 4.0是使用Tuple,但我宁愿有一个强类型的类。

(未测试的代码):

var list = new Collection<Tuple<int,string>> 
      { 
      Tuple.Create(1, "Test1"), 
      Tuple.Create(2, "Test2") 
      } 
+0

传递这个类到JavaScriptSerializer()。Serialize(list)会产生键/值对,我试图避免在我的情况下,因为我只需要像[1 ,“Test1”],[2,“Test2”] –

+0

谢谢,但我使用的是.NET 3.5,如果我有超过2个值说int,string,int,int –

+0

@Rocky - 我只提到.NET 4.0为其他读者和完整性。在你的情况下,我仍然会使用自定义类 - 你可以添加属性到不同的属性来控制序列化。 – Oded

4


泛型的要点在于,您不能将intstring放在同一个集合中。

相反,您应该创建自己的类,其中包含intstring属性,然后创建该类的通用集合。

+0

谢谢,我以同样的方式思考,但序列化键/值对来了.i.e键是属性名称和值是属性的值。我只想在序列化后像逗号分隔形式的值,如[1,“Test1”],[2,“Test2”] –

+0

呵呵?我不确定你是什么意思。 – SLaks

+0

将此类传递给JavaScriptSerializer()。Serialize(list)将生成键/值对 –

2

不是真的,事实上,你有不同的类型,使使用通用毫无意义。

你可以使用List<object>代替ArrayList的,但真的没有一点。相反,您可以创建一个自定义类来保存2个值并将其用于泛型类型。

约翰

0
var list = new List < Dictionary<int, string>>(); 

那么你可以填充它的数据,因为你需要。

+0

如果我有超过2个值,该怎么办? –

+0

在这个阶段,您将需要为它创建一个自定义类,但对于您的情况,这将有效地工作。 –

1

也许你需要解释?

var list = new Dictionary<int, string> 
{ 
    { 1, "Test1" }, 
    { 2, "Test2" } 
}; 
0

我不知道你实际上是试图实现,但在我看来,你试图模仿字典的行为,可以两个不同的值映射到每个其他。这些值可以是任何你想要的类型。

事情是这样的:

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

,你可以处理你的数据那样简单:

string t1 = d[1]; //will hold "Test1" 
string t2 = d[2]; //will hold "Test2" 

你要这样呢?