如何将我的程序从使用for循环更改为foreach循环

时间:2017-01-10 22:57:58

标签: c# foreach

我对如何将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);







        }



    }
}

如果有人可以帮我完成这个程序,那将非常有帮助! 谢谢!

2 个答案:

答案 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);