我有一个字符串数组,其中大多数是值“true”或“false”,有些不是并且将保持原样。 我希望遍历数组并将任何“true”或“false”更改为1'或0 我有点开始了,但我正在努力学习语法
string[] data = args.Trim().Split(',');
// Loop over strings
foreach (string s in data)
{
if(s == "true")
{
Convert.ToInt32(s)=1;????
}
else if(s == "false")
{
??????
}
}
请有人提供一些指导
答案 0 :(得分:3)
也许是Linq:
string[] data = args.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => StringComparer.OrdinalIgnoreCase.Equals("true", s.Trim()) ? "1"
: StringComparer.OrdinalIgnoreCase.Equals("false", s.Trim()) ? "0" : s)
.ToArray();
添加StringComparer.OrdinalIgnoreCase
以显示如果需要可以忽略此案例。
Here's带有示例字符串注释的演示。
this,1,is,not,0
答案 1 :(得分:2)
写一个这样的函数。然后,您可以将“已转换的数据”复制到新的List
并将其作为array
或其他任何内容返回。
public string[] GetData()
{
string[] data = args.Trim().Split(',');
List<string> returnData = new List<string>();
// Loop over strings
foreach (string s in data)
{
if(s == "true"){
returnData.Add("1");
}
else if(s == "false"){
returnData.Add("0");
}
else
returnData.Add(s);
}
return returnData.ToArray();
}
假设您希望array
类型string
未指定。
其他选项,因为不清楚你要对两种类型的数据做什么是在你拿出它们时解析它们,或者将它们分成两个列表。
string[] rawDatas = GetData();
foreach(string rawData in rawDatas)
{
short iRawData;
if (Int16.TryParse(rawData, out iRawData))
{
if (iRawData == 1 || iRawData == 0)
{
//Add a bit
iRawData;
}
else
{
// add a string
rawData;
}
}
else
{
//add a string
rawData;
}
}
或强>
public void GetData(out List<string> strings, out List<Int16> shorts)
{
string[] data = args.Trim().Split(',');
strings= new List<string>();
shorts = new List<Int16>();
// Loop over strings
foreach (string s in data)
{
if(s == "true"){
shorts.Add(1);
}
else if(s == "false"){
shorts.Add(0);
}
else
returnData.Add(s);
}
}
或强> 添加到一个对象数组,虽然这需要在另一侧回滚,这是无效的(参见boxing and unboxing)
public object[] GetData()
{
string[] data = args.Trim().Split(',');
List<object> returnData = new List<object>();
// Loop over strings
foreach (string s in data)
{
if(s == "true"){
returnData.Add(1);
}
else if(s == "false"){
returnData.Add(0);
}
else
returnData.Add(s);
}
return returnData.ToArray();
}
答案 2 :(得分:1)
如果你只想做0和1而不是
string[] data = args.Trim().Split(',');
int[] a = new int[data.length];
// Loop over strings
int count=0;
foreach (string s in data)
{
if(s == "true"){
int a[count] = 1;
}
else if(s == "false"){
int a[count]=0;
}
else
{
a[count] = Convert.ToInt32(s);
}
count++;
}
或使用linq
var intlst = data.
Select(input => input == "true" ? 1 :
(input == "false" ? 0 : Convert.ToInt32(input)));
答案 3 :(得分:0)
试试这个:
var result = data.Select(input => input == "true" ? 1 : (input == "false")? 0 : -1);
答案 4 :(得分:0)
你可以通过简单的循环来完成这个:
List<string> newArgs = new List<string>();
for (int i = 0; i <= args.Length - 1; i++)
{
newArgs.Add(args[i] == "true" ? "1"
: args[i] == "false" ? "0"
: args[i]);
}
或者使用linq,它将在内部使用扩展对象来遍历集合。
答案 5 :(得分:-4)
我可以看到你遇到的问题是自己保存变量而不创建新数组。当您键入行
string[] data = args.Trim().Split(',');
您声明该数组中的变量是string类型。如果要将它们转换为整数,则需要创建一个新的整数数组或未定义的类型。我认为您正在使用C#,我相信数组中多种类型的代码是
object[]
在这种情况下,你会做类似
的事情object[] data = args.Trim().Split(',');
foreach(string s in data){
if(s == "true"){
s = 1;
Convert.ToInt32(s);
}
else if(s == "false"){
s = 0;
Convert.ToInt32(s);
}
}