class Program
{
static void Main(string[] args)
{
string ss = "1,2,3";
string search = "2";
ArrayList a = new ArrayList();
a.Add(ss.Split(','));
if (a.Contains(search))
{
Console.WriteLine("true");
}
else
{
Console.WriteLine("false");
}
}
}
答案 0 :(得分:5)
您正在为ArrayList
添加一系列字符串。 String.Split()
的返回值为string[]
,因为ArrayList
是无类型的,您可以添加任何类型的对象(即使是不同类型的对象)。
改变这个:
a.Add(ss.Split(','));
对此:
a.AddRange(ss.Split(','));
由于所述ArrayList没有为其项目键入(它包含通用object
s)。这意味着你可以这样做:
a.Add(1);
a.Add("blue");
a.Add(AppDomain.CurrentDomain);
a.Add(new System.Windows.Forms.Control());
a.Add(new string[] { "red", "blue" });
在这种情况下,a.Contains("red")
之类的搜索将返回false
,因为a
包含字符串数组,并且针对项目而不是针对其内容执行搜索。例如:
string[] values = ss.Split(',');
a.Add(values);
bool x = a.Contains("2"); // false
bool y = a.Contains(values); // true
AddRange方法执行如下操作:
foreach (string value in values)
a.Add(value);
这样a
包含数组中的项,而不是数组本身。
小提示
如果你正在学习C#,我会避免使用紧凑的代码,更多的是看看你在做什么:
string[] values = ss.Split(',');
a.AddRange(values);
你的收藏中更明显的是什么。第二步是使用泛型集合(强类型):
List<string> a = new List<string>();
a.AddRange(values); // OK
a.Add(values); // Compiler error
在这种情况下,如果您尝试添加错误类型的对象,编译器将发出错误。
答案 1 :(得分:1)
尽量避免使用ArrayList和其他过时的类;使用泛型
收藏品,例如, List<String>
:他们更安全;在你的情况下:
List<String> a = new List<String>();
// If you try erroneous "a.Add(ss.Split(','))" here
// it'll be compile time error instead of misterious run time misbehaviour
a.AddRange(ss.Split(','));
if (a.Contains(search))
Console.WriteLine("true");
else
Console.WriteLine("false");
使用 Linq ,您可以将搜索放在一行:
class Program {
static void Main(string[] args) {
String ss = "1,2,3";
String search = "2";
Console.WriteLine(ss.Split(',').Contains(search) ? "true" : "false");
}
}
答案 2 :(得分:-1)
以下是修改后的代码供您参考。
class Program
{
static void Main(string[] args)
{
string ss = "1,2,3";
string search = "2";
string[] arr = ss.Split(',');
foreach(string ar in arr)
{
if (ar.Equals(search))
{
Console.WriteLine("true");
}
else
{
Console.WriteLine("false");
}
}
}
}