错误无法将类型 '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);
}
}
我在下面发布的代码没有 运行,因为
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);
}
}