尝试使用文件中的文本并对其进行排序

时间:2013-10-19 19:49:37

标签: c#

每次尝试这样做时,我都会碰到一堵砖墙。我无法弄清楚为什么我的代码不会从文本文件中提取信息并对其进行排序。我所做的一切看起来都很好。 我在第76,86和103行得到了3个错误。他们陈述了你的选择项目'在当前的背景下并不存在您的选择价格'在当前的背景下是否存在。 但我没有看到什么是错的。 当我输入日期时,例如:public string [] yourChoicesItems = {etc ....}它的工作原理。 为什么这不起作用?

我的文本文件是:(每行前面有一个空格)

BlueberryBagels 0.75
 HashBrowns 2.50
 BottledSoda 1.50
 咖啡0.90
 甜甜圈1.50
 FrenchFries 1.50
 BlueberryMuffins 0.85
 LiteYogurt 0.75
 HotChocolate 1.75
 OnionSoup 3.00
 PecanPie 2.75
 PurpleYam 2.75
 StrawberryBagels 0.80
 吐司2.00
 VanillaIceCream 2.75
 IcedTea 1.00

using System.IO;

namespace testce
{
    public partial class MainScreen : Form
    {
        static void InsertSort(IComparable[] array)
        {
            int i, j;
            for (i = 1; i < array.Length; i++)
            {
                IComparable value = array[i];
                j = i - 1;
                while ((j >= 0) && (array[j].CompareTo(value) > 0))
                {
                    array[j + 1] = array[j];
                    j--;
                }
                array[j + 1] = value;
            }
        }
        int count = 0;
        double totalTax = 0;
        double totalSale = 0;

        public MainScreen()
        {
            FileStream fStream = new FileStream("menu.txt", FileMode.Open, FileAccess.Read);
            StreamReader inFile = new StreamReader(fStream);
            string inValue;
            string[] values;
            double price;
            List<string> lines = new List<string>();
            while (!inFile.EndOfStream)
            {
                inValue = inFile.ReadLine();
                lines.Add(inValue);
                values = (inValue.Split(" ".ToCharArray()));
                price = double.Parse(values[2]);
                InsertSort(values);
            }
            inFile.Close();
            InitializeComponent();
            InitializeControls();

            for (int index = 0; index < listBox.SelectedIndices.Count; index++)
            {
                subTotal = subTotal + yourChoicesPrices[listBox.SelectedIndices[index]];
            }

            for (int index = 0; index < listBox.SelectedIndices.Count; index++)
            {
                textBox.AppendText(yourChoicesItems[listBox.SelectedIndices[index]] + "\n");
            }
            Text = "Thank you for using Food Systems Inc.";
            this.listBox.DataSource = yourChoicesItems;
            this.btnOne.Text = "Place Order";
            this.label.Text = "Menu Selection";
            this.labell.Text = "Order Information";
        }

        public System.Windows.Forms.ListBox listBox;
        private System.Windows.Forms.Label label;
        private System.Windows.Forms.Button btnOne;
        private System.Windows.Forms.TextBox textBox;
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码与Java类似,并且它在c#中不太正确所以我做了一些修改:

class FoodData
{
    public string FoodName { get; set; }
    public double Price { get; set; }
}

首先,我们使用oop语言,因此最好使用具有两个属性的类而不是单个String

if (!System.IO.File.Exists("menu.txt"))
            return;
        string[] values;
        double price;
        List<FoodData> lines = new List<FoodData>();
        using (System.IO.StreamReader sr = new System.IO.StreamReader("menu.txt"))
        {
            while (sr.Peek() > -1)
            {
                values = sr.ReadLine().Split(' ');
                FoodData tmp = new FoodData();
                tmp.FoodName = values[0];
                tmp.Price = Convert.ToDouble(values[1]);
                lines.Add(tmp);
            }
        }

这是c#中读取文件的常用方法。使用构造允许来避免关闭sr,因为在此之后指针立即被丢弃。

现在,如果要使用列表的Sort方法,则必须实现IComparable接口

lass FoodData_SortByPriceByAscendingOrder : IComparer<FoodData>
{
    public int Compare(FoodData x, FoodData y)
    {
        if (x.Price > y.Price) return 1;
        else if (x.Price < y.Price) return -1;
        else return 0;
    }
}
class FoodData_SortByPriceByDescendingOrder : IComparer<FoodData>
{
    public int Compare(FoodData x, FoodData y)
    {
        if (x.Price < y.Price) return 1;
        else if (x.Price > y.Price) return -1;
        else return 0;
    }
}
class FoodData_SortByName : IComparer<FoodData>
{
    public int Compare(FoodData x, FoodData y)
    {
        return string.Compare(x.FoodName, y.FoodName);
    }
}

这3个类继承了IComparer接口(接收FoodData列表)。这并不难理解,但here你可以找到参考文献,here一个例子

完成课程后,您可以从主要课程中调用这些课程:

FoodData_SortByPriceByAscendingOrder fAsc = new FoodData_SortByPriceByAscendingOrder();
        lines.Sort(fAsc);
        FoodData_SortByPriceByDescendingOrder fDesc = new FoodData_SortByPriceByDescendingOrder();
        lines.Sort(fDesc);
        FoodData_SortByName fByName = new FoodData_SortByName();
        lines.Sort(fByName);

答案 1 :(得分:0)

yourChoicesPricesyourChoicesItems未在给定代码中声明。这就是你得到这个错误的原因。你需要声明它们。