任何人都可以帮我弄清楚如何在不使用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>();
}
答案 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#,而动态关键字实际上是指与动态类型语言交互,如果类型系统妨碍你,你应该重新考虑你的设计。此外,如果你真的需要管理两种类型的集合,你应该将它包装在一个类中,并从客户端代码中隐藏这些血腥细节。