错误无法将类型 'string' 隐式转换为 'int' - 对于 ForEach 循环中的迭代器

Error Cannot implicitly convert type 'string' to 'int' - for the iterator in a ForEach loop

我在下面发布的代码没有 运行,因为

Error - Cannot implicitly convert type 'string' to 'int'

在我的两个 if 条件中,迭代器 i 都发生了这个错误。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MaleOrFemale
{
    class Program
    {
        static void Main(string[] args)
        {
            string[,] names = new string [7,2] {{"Cheryl Cole","F"},{"Hilary Clinton","F"},{"Noel Gallagher","M"},{"David Cameron","M"},{"Madonna","F"},{"Sergio Aguero","M"},{"Sheik Mansour","M"}};
            int mCount = 0;
            int fCount = 0;


            foreach ( var i in names)
            {
                if (names[i,1]== "M")
                {
                    mCount += 1;  
                }
                else if (names[i,1]=="F")
                {
                    fCount += 1;
                }
            }

            Console.WriteLine("mCount = {0}", mCount);
            Console.WriteLine("fCount = {0}", fCount);
            Console.Read();


        }
    }
}

在这种情况下,为什么我的数组索引不能使用 foreach 迭代器?

您正在尝试通过索引访问数组,索引应该是整数。

这里当你调用names[i,1]时,i应该是整数而不是字符串。当你有 foreach ( var i in names) 时, i 被推断为字符串,因为名称是 string[,].

类型的数组

如果您想通过索引访问每个元素,请尝试使用 for 循环代替

for(var i = 0; i < names.GetLength(0); i++)
{
    if (names[i,1]== "M")
    {
        mCount += 1;  
    }
    else if (names[i,1]=="F")
    {
        fCount += 1;
    }
 }

请记住,当您使用 foreach 时,您访问的是元素而不是索引。

但这里最好的方法是定义一个 class 而不是将数据保存到多维数组中。

public class Person
{
    public string Name { get; set; }
    public Gender Gender { get; set; }
}

public enum Gender
{
    Male,
    Female
}

程序将如下所示

var people = new List<Person>();
people.Add(new Person(){ Name = "Cheryl Cole", Gender = Gender.Female });
people.Add(new Person(){ Name = "Hilary Clinton", Gender = Gender.Female });
people.Add(new Person(){ Name = "Noel Gallagher", Gender = Gender.Male });
int mCount = 0;
int fCount = 0;

foreach (var person in people)
{
    if (person.Gender == Gender.Male)
        mCount += 1;
    else if (person.Gender == Gender.Female)
        fCount += 1;
}

Console.WriteLine("mCount = {0}", mCount);
Console.WriteLine("fCount = {0}", fCount);
Console.Read();

或者您可以使用 linq 来计算具有特定条件的项目的整个概念

Console.WriteLine("#Male = {0}", people.Count(x=>x.Gender == Gender.Male));
Console.WriteLine("#Female = {0}", people.Count(x=>x.Gender==Gender.Female));

var i 不包含整数值。所以不能像这样访问names[i,1].所以你的实现应该像下面这样改变。

        foreach ( var i in names){
            if (i[1] == "M"){
                mCount++;  
            }
            else if (i[1] == "F"){
                fCount++;
            }
        }

您的迭代器将return一个数组,而不是一个整数。

尝试这样的事情:

        foreach ( var i in names)
        {
            if (i[1]== "M")
            {
                mCount += 1;  
            }
            else if (i[1]=="F")
            {
                fCount += 1;
            }
        }

尽管正如其他人所提到的,这是一种草率的做法。最好使用结构 and/or 自定义 类 and/or 枚举。

对于您的特定情况,不需要 foreach 循环,foreach 将迭代您的 多维 数组中的每个元素并且 return每个元素一个一个。这就是您收到错误的原因。由于 i 将是每次迭代的字符串值,并且您正试图在数组索引中使用它,它只能接受一个整数值。

您可以使用一个简单的 for 循环来解决这个问题,例如:

for (var i = 0; i < names.GetLength(0); i++)
{
    if (names[i, 1] == "M")
    {
        mCount += 1;
    }
    else if (names[i, 1] == "F")
    {
        fCount += 1;
    }
}

注意GetLength方法,它将return指定维度的长度。


但更好的选择是对数据使用 class,而不是多维数组,甚至对性别使用 enum

public class MyDataClass
{
    public string Name { get; set; }
    public Gender Gender { get; set; }
}

public enum Gender
{
    Male, 
    Female,
    Other,
}

然后你可以做:

List<MyDataClass> list = new List<MyDataClass>
{
    new MyDataClass {Name = "Cheryl Cole", Gender = Gender.Female},
    new MyDataClass {Name = "Hilary Clinton", Gender = Gender.Female},
    new MyDataClass {Name = "Noel Gallagher", Gender = Gender.Female},
    new MyDataClass {Name = "David Cameron", Gender = Gender.Male},
    new MyDataClass {Name = "Madonna", Gender = Gender.Female},
    new MyDataClass {Name = "Sergio Aguero", Gender = Gender.Male},
    new MyDataClass {Name = "Sheik Mansour", Gender = Gender.Male},

};

foreach (var item in list)
{
    if (item.Gender == Gender.Male)
        mCount += 1;
    if (item.Gender == Gender.Female)
        fCount += 1;
}

在编译时,变量i被确定为String。因此,使用 foreach 迭代器不适用于您当前的实现。

或者,您可以通过以下代码使用 for 迭代器:

string[,] names = new string[7, 2] { { "Cheryl Cole", "F" }, { "Hilary Clinton", "F" }, { "Noel Gallagher", "M" }, { "David Cameron", "M" }, { "Madonna", "F" }, { "Sergio Aguero", "M" }, { "Sheik Mansour", "M" } };
int mCount = 0;
int fCount = 0;

int length = names.GetLength(0);

for (int i = 0; i < length; i++)
{
    if (names[i, 1] == "M")
    {
        mCount += 1;
    }
    else if (names[i, 1] == "F")
    {
        fCount += 1;
    }
}

Console.WriteLine("mCount = {0}", mCount);
Console.WriteLine("fCount = {0}", fCount);
Console.Read();

输出:

mCount = 4
fCount = 3

上面的代码使用names.GetLength(0); 来获取0 维度的数组长度。在我们的例子中,输出 7.

由于您正在使用 foreach 循环,因此您的计数器变量 (i) 被设置为数组中的字符串(值)... 请改用 for 循环... for(int i=0; i< names.GetLength(0);i++)

您应该探索使用 类 和 LINQ 的选项,以使代码更清晰和更易于维护。

using System;
using System.Collections.Generic;
using System.Linq;

public enum Gender
{
    Female, Male
}

public class Person
{
    public string Name { get; private set; }
    public Gender Gender { get; private set; }

    public Person(string name, Gender gender)
    {
        Name = name;
        Gender = gender;
    }
}

public class Program
{
    public static void Main()
    {
        var persons = new[] { new Person("Cheryl Cole", Gender.Female), new Person("David Cameron", Gender.Male) };

        var mCount = persons.Count(p => p.Gender == Gender.Male);
        var fCount = persons.Count(p => p.Gender == Gender.Female);

        Console.WriteLine("mCount = {0}", mCount);
        Console.WriteLine("fCount = {0}", fCount);
    }
}