2

我有一个字符串数组,其中大部分是“真”或“假”值,有些不是,要保持原样。我希望循环遍历数组并将任何“真”或“假”更改为 1' 或零我已经开始了它,但在语法上苦苦挣扎

string[] data = args.Trim().Split(',');

// Loop over strings
foreach (string s in data)
{
    if(s == "true")
    {
        Convert.ToInt32(s)=1;????
    }
    else if(s == "false")
    {
        ??????
    }
}

请有人提供一些指导

4

6 回答 6

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以显示如何在需要时忽略大小写。

这是一个带有注释示例字符串的演示。

this,1,is,not,0
于 2013-04-15T15:42:26.537 回答
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);
    }
 }

添加到对象数组,尽管这需要在另一边进行回滚,这是低效的(请参阅装箱和拆箱

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();
 }
于 2013-04-15T15:38:55.950 回答
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)));
于 2013-04-15T15:37:33.430 回答
0

您可以通过简单的 for 循环来做到这一点:

        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 ,它将在内部使用扩展对象来遍历集合。

于 2013-04-15T15:55:20.380 回答
0

尝试这个:

var result = data.Select(input => input == "true" ? 1 : (input == "false")? 0 : -1);
于 2013-04-15T15:37:23.490 回答
-4

好吧,我可以看到您遇到的问题是在不创建新数组的情况下自己保存变量。当您键入该行时

string[] data = args.Trim().Split(',');

您声明该数组中的变量是字符串类型。如果您希望将它们转换为整数,则需要创建一个新的整数数组或未定义类型。我认为您正在使用 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);
    }
}
于 2013-04-15T15:48:24.200 回答