尝试为 SUM 程序提出控制中断逻辑

Trying to come up with control break logic for a SUM program

我正在尝试将与帐户关联的总和相加。所以我的变量 vControl 将成为我的帐户变量,当该变量发生变化时,我需要跳出循环并打印出 SUM 结果和帐户名称。我可以轻松地管理打印部分和 SUM 逻辑,但我正在努力想出正确的循环逻辑来遍历数组并在帐户更改时中断,以及当帐户更改再次返回 SUM 循环时.顺便说一下,我正在读取 CSV 文件。

    static void Main(string[] args)
    {
        string[] parsedLine;
        string temp;


        String path = @"C:\Users\jhochbau\documents\visual studio 2015\Projects\CsvReader\CsvReader\Position_2016_02_25.0415.csv";
        //var accounts = new Dictionary<string, Positions>();
        //Adding lines read into a string[];
        string[] lines = File.ReadAllLines(path);
        foreach (string line in lines)
        {
            parsedLine = line.Split(',');
            string vControl = parsedLine[0];


            //need loop here to add these sums and break when vControl changes accounts.
            //int vSettleMMSum += parsedLine[10];
            //int vOpenSum += parsedLine[6];
            //int vBuySum += parsedLine[7];
            //int vSellSum+= parsedLine[8];

        //After each Break need to print out Account name and sums from above.





        }
    }

Class 文件:

      public class Positions
    {
        public string account;
        public string symbol;
        public string prevClose;
        public string curPrx;
        public string settlePX;
        public string Mult;
        public double open;
        public int buy;
        public int sell;
        public string netMM;
        public double settleMM;
        public string settleDay;
        public string underlying;


    }

你可以在不跳出循环的情况下做你想做的事,看看下面的内容:

    static void Main(string[] args)
    {
        string[] parsedLine;
        string temp;


        String path = @"C:\Users\jhochbau\documents\visual studio 2015\Projects\CsvReader\CsvReader\Position_2016_02_25.0415.csv";
        //var accounts = new Dictionary<string, Positions>();
        //Adding lines read into a string[];
        string[] lines = System.IO.File.ReadAllLines(path);
        string prevControl = string.Empty;
        string currControl = string.Empty;
        int vSettleMMSum = 0;
        int vOpenSum = 0;
        int vBuySum = 0;
        int vSellSum = 0;
        foreach (string line in lines)
        {
            parsedLine = line.Split(',');
            prevControl = currControl;
            currControl = parsedLine[0];


            //need loop here to add these sums and break when vControl changes accounts.
            vSettleMMSum += int.Parse(parsedLine[10]);
            vOpenSum += int.Parse(parsedLine[6]);
            vBuySum += int.Parse(parsedLine[7]);
            vSellSum += int.Parse(parsedLine[8]);

            if (!string.IsNullOrWhiteSpace(prevControl) && !string.Equals(prevControl, currControl))
            {
                //After each Break need to print out Account name and sums from above.
                // Do printing here as part of the loop, at the very end of the loop code block.

                // After printing, reset your values.
                vSettleMMSum = 0;
                vOpenSum = 0;
                vBuySum = 0;
                vSellSum = 0;
            }
        }
    }

我将您的 vControl 更改为使用 prevControlcurrControl 并检查它们是否不同。

更改变量声明。您需要 属性 而不是字段。因此,将下一个代码放入您的 class (Program)

 private string _vControl;
        public string vControl {get
            {
                return _vControl;
            }
            set
            {
                _vControl = value;
                // print account name or what you want
            }
        }

foreach 基于循环的算法(如@gmiley 回答中的算法)不起作用,因为它们缺少最后一组。为了使其正确,他们需要在循环后复制一些代码。

这就是为什么我更喜欢使用显式枚举器和两个嵌套循环,如下所示:

static void Main(string[] args)
{
    var path = @"C:\Users\jhochbau\documents\visual studio 2015\Projects\CsvReader\CsvReader\Position_2016_02_25.0415.csv";
    using (var parsedLines = File.ReadLines(path).Select(line => line.Split(',')).GetEnumerator())
    {
        bool more = parsedLines.MoveNext();
        while (more)
        {
            // Initialize
            var account = parsedLines.Current[0];
            int vSettleMMSum = 0;
            int vOpenSum = 0;
            int vBuySum = 0;
            int vSellSum = 0;
            do
            {
                // Aggregate
                vSettleMMSum += int.Parse(parsedLines.Current[10]);
                vOpenSum += int.Parse(parsedLines.Current[6]);
                vBuySum += int.Parse(parsedLines.Current[7]);
                vSellSum += int.Parse(parsedLines.Current[8]);
                more = parsedLines.MoveNext();
            }
            while (more && account == parsedLines.Current[0]);
            // Consume
            // Here you have the account and sums, do whatever you like (print etc.)
        }
    }
}