【问题标题】:Change arraylist to generic将arraylist更改为通用
【发布时间】:2011-10-19 10:00:54
【问题描述】:

我正在使用以下代码:

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

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

编辑: 上面我在一个arraylist对象中只使用了两个值,我可能有多个int和string的项目。

【问题讨论】:

  • 你应该用自定义的class/struct/Tuple&lt;&gt;/etc 替换你的ArrayLists。它将更具可读性。

标签: c# .net generics .net-3.5


【解决方案1】:

您不能在泛型列表中混合类型(除非泛型类型是 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")
           }

【讨论】:

  • 将此类传递给 JavaScriptSerializer().Serialize(list) 将产生键/值对,在我的情况下我试图避免这种情况,因为我只需要 [1,"Test1"],[ 2,"Test2"]
  • 谢谢,但我使用的是 .NET 3.5,如果我有超过 2 个值,比如 int、string、int、int
  • @Rocky - 我只为其他读者和完整性提到了 .NET 4.0。在您的情况下,我仍然会使用自定义类 - 您可以将属性添加到不同的属性以控制序列化。
  • "将属性添加到不同的属性以控制序列化" 我想你即将击中钉子 :) 我怎样才能阻止属性名称进入序列化输出?
  • @Rocky - 不确定,但请查看DataMemberAttribute 文档和该命名空间中的其他类。
【解决方案2】:

没有。
泛型的全部意义在于您不能将intstring 放在同一个集合中。

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

【讨论】:

  • 谢谢,我也是这么想的,但是序列化键/值对即将到来。即键是属性名称,值是属性的值。我只想要在序列化后以逗号分隔的值,如 [1,"Test1"],[2,"Test2"]
  • 嗯?我不确定你的意思。
  • 将此类传递给 JavaScriptSerializer().Serialize(list) 将生成键/值对
  • 我明白了。那么你只能使用ArrayListList&lt;object&gt;
【解决方案3】:

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

您可以使用List&lt;object&gt; 代替 ArrayList,但实际上没有意义。相反,您可以创建一个自定义类来保存这 2 个值并在泛型类型中使用它。

约翰

【讨论】:

    【解决方案4】:

    也许你需要字典?

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

    【讨论】:

      【解决方案5】:
      var list = new List < Dictionary<int, string>> ();
      

      然后您可以根据需要填充数据。

      【讨论】:

      • 如果我有超过 2 个值怎么办?
      • 在这个阶段,您需要为其创建一个自定义类,但对于您的情况,这将有效。
      【解决方案6】:

      我不确定您实际上想要实现什么,但在我看来,您正在尝试模仿 dictionaryma​​p 的行为,这可以将两个不同的值相互映射。这些值可以是您想要的任何类型。

      类似这样的:

      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"
      

      你想要这样的东西吗?

      【讨论】:

        猜你喜欢
        • 2019-10-03
        • 1970-01-01
        • 2016-11-19
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 2013-04-09
        相关资源
        最近更新 更多