C# 获取列[0]值,而列[1]等于上一个列[1]迭代

C# 获取列[0]值,而列[1]等于上一个列[1]迭代,c#,.net,arraylist,C#,.net,Arraylist,我使用的是美联储储备网站的利率表,其中包含两个COL [0]==短日期(例如“1962年1月1日”) [1] ==该日期的费率,单位为[0] 因此文件看起来像:1/1/1962,3.8 每次运行此实用程序时,它都会获取/打开文件,删除1997年5月31日及之前日期的所有数据。然后,它用以下标题写入流(在我的例子中是另一个csv文件):rowid、beginningdate、expirationdate、rate 我遇到的问题是,部分要求是,如果连续几天的费率(col[1])具有相同的值,则不具体

我使用的是美联储储备网站的利率表,其中包含两个COL [0]==短日期(例如“1962年1月1日”) [1] ==该日期的费率,单位为[0]

因此文件看起来像:1/1/1962,3.8

每次运行此实用程序时,它都会获取/打开文件,删除1997年5月31日及之前日期的所有数据。然后,它用以下标题写入流(在我的例子中是另一个csv文件):rowid、beginningdate、expirationdate、rate

我遇到的问题是,部分要求是,如果连续几天的费率(col[1])具有相同的值,则不具体列出这些天。相反,请写入第一个连续汇率的日期,然后写入汇率再次更改之前的最后一个日期

我的问题是:

如何在循环期间检查循环前后的每个迭代列[1]值,以便写入正确的开始日期和结束日期?我希望将一个值的索引增加一个,这样我就可以得到下一行中的值,但这样做很困难

我已经尝试使用尽可能多的基于Linq的查询进行研究,但我找不到任何有效的方法,只需要另一双眼睛/另一个想法

以下是我目前正在做的事情:

int count=0;
var rateContents = File.ReadAllLines(resFile);
List<DateTime> lstDT = new List<DateTime>();
List<string> lstRate = new List<string>();
List<string> d = new List<string>();

foreach (var x in rateContents)
{
   lstDT.Add(Convert.ToDateTime(x.Split(',')[0]));
   lstRate.Add(x.Split(',')[1]);
}

int recordsOn_and_after6_1_97 = lstDT.Where(z => Convert.ToDateTime(z) >= Convert.ToDateTime("6/1/1997")).Count();
int recordsbefore6_1_97 = lstDT.Where(z => Convert.ToDateTime(z) < Convert.ToDateTime("6/1/1997")).Count();
lstRate.RemoveRange(0, recordsbefore6_1_97);
lstDT.RemoveRange(0, recordsbefore6_1_97);

using (StreamWriter sw = new StreamWriter(desktoppath + "somefile.csv"))
{
   while (count <= (recordsOn_and_after6_1_97 - 1))
   {
    //sw.WriteLine("Index Number,Effective Date,Expiration Date,Rate");
    d.Add(Convert.ToDateTime(lstDT[count].ToShortDateString()) + "," + lstRate[count]);
    count++;
   }
}

count = 0;
/*Below is where I am stuck. Realistically I think I'd want to do something like: var variable = argh.val[count+1]; or something, but I can't get that to work either. I'm missing something simple at this point.*/
foreach (var argh in d.Select((val, ind) => new { Value = val, Index = ind}))
{
   //var curdt = Convert.ToDateTime(argh.Split(',')[0]).ToShortDateString();
   //var currate = argh.Split(',')[1].ToString();
   var curdt = argh.Value.Split(',')[0];
   var currate = argh.Value.Split(',')[1];
   var x = currate.CompareTo(currate[count + 1].ToString()).ToString() ;
   Console.WriteLine(x.ToString());
   //Console.WriteLine("val +1: " + curdt + " --- rate: " + currate.TakeWhile(z => z <= 10).ToString());
   count++;
   //Console.WriteLine(prevcurdt +" --- "+ currate);
}
int count=0;
var rateContents=File.ReadAllLines(resFile);
List lstDT=新列表();
List lstRate=新列表();
列表d=新列表();
foreach(费率内容中的var x)
{
lstDT.Add(Convert.ToDateTime(x.Split(',)[0]);
lstRate.Add(x.Split(',')[1]);
}
int recordsOn_和_after 6_1_97=lstDT.Where(z=>Convert.ToDateTime(z)>=Convert.ToDateTime(“6/1/1997”)).Count();
int recordsbefore 6_1_97=lstDT.Where(z=>Convert.ToDateTime(z)while(count我的想法是根据您的需要过滤速率。基本上只是一个简单的for循环,它查看当前速率两侧的速率-如果下一个速率不相同,我们知道当前日期是我们当前使用的任何条目的过期日期。如果上一个速率不相同,我们知道这是一个新条目

public class RateEntry
{
    public DateTime StartDate { get; set; }
    public DateTime ExpirationDate { get; set; }
    public decimal Rate { get; set; }
}

class Program
{

    const string DATE_FORMAT_IN = "yyyy-MM-dd";
    const string DATE_FORMAT_OUT = "yyyy-MM-dd";

    static void Main()
    {
        var inputRateDataRaw = File.ReadAllLines(@"c:\temp\RATES_IN.csv");

        DateTime startDate = new DateTime(1997, 05, 31);

        // parse the input dates and rates
        var rateDataFiltered = inputRateDataRaw
            .Select(rateData =>
            {
                var dataComponents = rateData.Split(',');
                DateTime rateDate = DateTime.ParseExact(dataComponents[0], DATE_FORMAT_IN, null);
                decimal rate = decimal.Parse(dataComponents[1]);
                return new RateEntry() { StartDate = rateDate, Rate = rate };
            })
            .Where(a => a.StartDate > startDate)
            .OrderBy(a => a.StartDate)
            .ToList();            

        List<RateEntry> rateRanges = new List<RateEntry>();

        for (int i = 0; i < rateDataFiltered.Count; i++)
        {
            RateEntry next = ((i + 1) == rateDataFiltered.Count) ? null : rateDataFiltered[i + 1];
            RateEntry last = (i == 0) ? null : rateDataFiltered[i - 1];
            RateEntry now = rateDataFiltered[i];
            // if this is the first rate, or if the last rate isn't this rate, this is a new entry.
            if (last == null || last.Rate != now.Rate)                
                rateRanges.Add(now); 
            // if the next rate isn't this one, then the current entry expiration is this one's start date.
            if (next == null || next.Rate != now.Rate) 
                rateRanges.Last().ExpirationDate = now.StartDate; 
        }

        // write the data out
        using (StreamWriter writer = new StreamWriter(@"c:\temp\RATES_OUT.csv"))
        {
            writer.WriteLine("ROWID;STARTDATE;EXPIRATIONDATE;RATE");

            for (int i = 0; i < rateRanges.Count; i++)
            {
                RateEntry rateEntry = rateRanges[i];
                writer.WriteLine($"{i};{rateEntry.StartDate.ToString(DATE_FORMAT_OUT)};{rateEntry.ExpirationDate.ToString(DATE_FORMAT_OUT)};{rateEntry.Rate}");
            }
        }

        Console.ReadKey();
    }
};
公共类费率条目
{
公共日期时间起始日期{get;set;}
公共日期时间过期日期{get;set;}
公共十进制率{get;set;}
}
班级计划
{
常量字符串日期\u格式\u IN=“yyyy-MM-dd”;
const string DATE\u FORMAT\u OUT=“yyyy-MM-dd”;
静态void Main()
{
var inputRateDataRaw=File.ReadAllLines(@“c:\temp\RATES_IN.csv”);
DateTime startDate=新的日期时间(1997,05,31);
//解析输入日期和速率
var rateDataFiltered=inputRateDataRaw
.选择(rateData=>
{
var-dataComponents=rateData.Split(',');
DateTime rateDate=DateTime.ParseExact(dataComponents[0],日期格式,空);
decimal rate=decimal.Parse(dataComponents[1]);
返回新的RateEntry(){StartDate=rateDate,Rate=Rate};
})
.其中(a=>a.StartDate>StartDate)
.OrderBy(a=>a.StartDate)
.ToList();
列表比率范围=新列表();
对于(int i=0;i
我刚才确实找到了一篇帖子,看起来它和我的问题是一样的。我要试一试。当你说“最后一次日期/之前/费率又变了”时,这是否意味着如果你有,比如说5月1日、6月1日、7月1日,1.1的到期日是6月还是7月?@steve16351,如果5月1日的利率是1%,但5月2日的利率是1.5%,那么它们将是电子表格上的单独条目。如果6月1日、6月2日和6月3日的利率都是2%,那么起始日将是6/1/yyyyy,到期日将是be 6/3/yyyy,希望这更有意义。啊,伙计,这太棒了!我知道评论不是为了“谢谢”,但是……谢谢!因为你,我学会了如何做更多的事情,而且效果很好。我将接受你的回答:-)