构建和使用通用列表?

时间:2011-06-08 20:23:31

标签: c# generics .net-4.0 generic-list

任何人都可以帮我弄清楚如何在不使用ArrayList的情况下简化此代码吗?

List<Pair> material = new List<Pair>();
List<string> list = new List<string>();

string tempStr;
int integer = -1;
foreach (string s in ((string)Value).Split(new char[1] { ',' }))
{
  if (int.TryParse(s, out integer))
  {
     tempStr = NameValue.AllKeys[integer];

     if (someCondition == true)
     {
        material.Add(new Pair(tempStr, integer));
     }
     else
     {
        list.Add(tempStr);
     }
  }
}
if(someCondition == true)
{
  return material.ExtensionMethodForLists();
}
else
{
  return list.ExtensionMethodForLists();
}

当我尝试过类似下面的内容时,如果没有初始化一个隐含式的变量,我会收到错误。

var list;
if(someCondition == true)
{
  list = new List<Pair>();
}
else
{
  list = new List<string>();
}

4 个答案:

答案 0 :(得分:6)

如果您使用的是不同类型,则需要为变量使用非泛型类型:

IList list;
if(someCondition == true)
{
  list = new List<Pair>();
}
else
{
  list = new List<string>();
}

IList list = someCondition ? (IList)new List<Pair>() : new List<string>();

就个人而言,我不确定它是一个伟大的设计,但它满足要求。

答案 1 :(得分:1)

不知道这是否真的简化了,但是像:

    public DataTable ParseToTable(string Value)
    {
        if (someCondition)
            return ParseInternal<Pair>(Value, (s, i) => new Pair(s, i));
        else
            return ParseInternal<string>(Value, (s, i) => s);
    }

    private DataTable ParseInternal<T>(string Value, Func<string,int,T> newItem)
    {
        List<T> list = new List<T>();

        string tempStr;
        int integer = -1;
        foreach (string s in ((string)Value).Split(new char[1] { ',' }))
        {
            if (int.TryParse(s, out integer))
            {
                tempStr = NameValue.AllKeys[integer];
                list.Add(newItem(tempStr, integer));
            }
        }
        return list.ExtensionMethodForLists();
    }

答案 2 :(得分:0)

如果您要使用var,则必须立即分配值。否则,正如@Marc建议的那样完美......(好吧,正如他所说 - 满足要求)

答案 3 :(得分:0)

在Python或其他动态类型语言中会有类似的东西。虽然如果您使用.net 4.0,您可以使用dynamic关键字而不是var。

但是,你使用的是强烈打字的C#,而动态关键字实际上是指与动态类型语言交互,如果类型系统妨碍你,你应该重新考虑你的设计。此外,如果你真的需要管理两种类型的集合,你应该将它包装在一个类中,并从客户端代码中隐藏这些血腥细节。