我对如何将for循环更改为foreach循环感到困惑。我有一段代码类似于我正在实现foreach循环的程序。
{
class Program
{
static void Main(string[] args)
{
int entered = 0;
string ayethatsprettygood;
bool dothesalamander = false;
string[] zipcode;
zipcode = new string[10] {"12789", "54012", "54481", "54982", "60007", "60103", "60187", "60188", "71244", "90210" }; //This array is the zipcodes
double[] prices;
prices = new double[10] { 2.40, 3.00, 3.50, 4.00, 4.50, 5.00, 5.25, 5.75, 6.10, 10.003 }; //This array is the prices
Console.Write("Enter a Zipcode:");
ayethatsprettygood = Console.ReadLine();
for (int i = 0; i < zipcode.Length; i++) {
if (ayethatsprettygood == zipcode[i])
{
dothesalamander = true;
entered = i;
break;
}
}
if (dothesalamander == true)
{
Console.WriteLine("We deliver to this zipcode {0} the price of delivery is {1}", zipcode[entered], prices[entered].ToString("C2"));
}
else
Console.WriteLine("We don't deliver to this zipcode {0}",ayethatsprettygood);
{
class Program
{
static void Main(string[] args)
{
int entered = 0;
string ayethatsprettygood;
bool dothesalamander = false;
char[] pizzasize;
pizzasize = new char[4] { 'S', 'M', 'L', 'X' }; //This array is the zipcodes
double[] pizzaprices;
pizzaprices = new double[4] { 6.99, 8.99, 12.50, 15.00 }; //This array is the prices
Console.Write("Enter a Pizza Size:");
ayethatsprettygood = Console.ReadLine();
foreach(char pizzaprice in pizzaprices )
{
if (ayethatsprettygood == pizzaprice)
{
dothesalamander = true;
entered = pizzaprice;
break;
}
}
if (dothesalamander == true)
{
Console.WriteLine("The size of the pizza is {0} the price is {1}", pizzasize[entered], pizzaprices[entered].ToString("C2"));
}
else
Console.WriteLine("Sorry you entered an invalid size {0}", ayethatsprettygood);
}
}
}
如果有人可以帮我完成这个程序,那将非常有帮助! 谢谢!
答案 0 :(得分:1)
使用普通的for循环,您可以自己管理索引,如果要遍历数组,则必须使用索引来查找项目。
var a = new string[] {"This","Is","An","Array"};
for (var i = a.GetLowerBound(0); i <= a.GetUpperBound(0); i = i + 1)
{
var s = a[i];
Console.WriteLine(s);
}
使用foreach循环,框架使用特殊接口(IEnumerable
)为您进行迭代和查找:
var a = new string[] {"This","Is","An","Array"};
foreach (var s in a)
{
Console.WriteLine(s);
}
大多数数组,列表,字典和其他类型的集合都实现IEnumerable
,因此您可以使用此技术来浏览大多数列表。如果IEnumerable
不可用,则无法使用foreach
。
foreach
构造需要更少的输入,并且迭代可以并行运行(使用Parallel.ForEach
),因此它具有一些优势。主要的缺点是there is no guarantee what order the elements will be processed,而且您不再能够访问其中包含索引的变量。在某些情况下,这可能是一个问题,例如在两个数组之间复制数据,其中顺序可能很重要。
此外,在使用枚举器时,如果由于混淆而导致impossible完全没有删除和添加项目,则强烈建议不要删除和添加项目。
答案 1 :(得分:1)
foreach
不是一个很好的选择(提示,并行数组实际上并不常用于“实际”代码)。
原因是,正如您所发现的那样,您不知道给定项目的索引是什么(foreach
不保证线性遍历,尽管它通常在实践中)。以下是解决问题的三种方法:
您可以在循环外部设置一个计数器,并在每次迭代时递增它。假设foreach
从索引0开始并递增1,您仍然会得到索引:
int iterationIndex = 0;
foreach (item in collection)
{
iterationIndex++;
}
当然,如果假设错误(实际上,遍历通常是线性的,并且总是在数组和列表中),那么代码就会中断。
您知道您要找的是哪个项目;您可以使用数组/列表方法来获取其索引:
int index = collection.IndexOf(item);
var parallelItem = parallelCollection[index];
如果collection
有多个item
实例(实际上是重复键),则会中断。
如果丢弃并行数组并使用对象,所有这些都没有用。说我有一个披萨类:
public class Pizza
{
public double Size {get; set}
public double Price {get; set;}
}
现在数据关联由框架处理,我可以写:
Pizza requestedPizza;
foreach (Pizza pizza in allPizzas)
{
if (pizza.Price == enteredPrice)
{
requestedPizza = pizza;
break;
}
}
Console.WriteLine($"Found pizza size {requestedPizza.Size} that matches price {requestedPizza.Price}");
为了将来使用,整个foreach
完全没必要,LINQ会为我们写它:
Pizza requestedPizza = allPizzas.FirstOrDefault(p => p.Price == requestedPrice);