首页 > 解决方案 > 循环遍历列表并将前一行与当前行进行比较。我有一个大部分重复的帐号列表

问题描述

我的结果二是我通过使用 LINQ 排序从另一个列表中添加的帐号和日期列表。结果二的列表包含许多重复的帐号,但我想过滤列表以删除重复项,而不仅仅是选择第一个实例。

我正在寻找具有最早日期的帐号。我从流阅读器中得到了一些输出,但它的行为不像预期的那样。我仍然收到每一行,没有删除。

我正在尝试比较帐号是否与上一行中的帐号匹配并且当前日期较旧,以删除具有较新日期的帐号实例。

有任何想法吗?

    foreach (var valueTwo in resultTwo)
    {
        var valueString = valueTwo.Name.ToString();
        var currentAccount = valueString.Substring(0, valueString.IndexOf('\t'));
        var currentDateTwo = (valueString.Substring((valueString.IndexOf('\t') + 1), 10).Replace("/", ""));
        int currentDate = Convert.ToInt32(currentDateTwo);
        var prevAccount = "";
        int prevDate = 0;

        if (currentAccount != prevAccount)
        {
            forecastTestList.Add(currentAccount + '\t' + currentDate);
        }

        if (currentAccount == prevAccount)
        {
            if (currentDate > prevDate)
            {
                forecastTestList.Remove(prevAccount + '\t' + prevDate);
                forecastTestList.Add(currentAccount + '\t' + currentDate);
            }
        }
        prevAccount = currentAccount;
        prevDate = currentDate;

        //srcheckForecast.WriteLine(valueTwo.Name);
    }

    foreach (var valueThree in forecastTestList)
    {
        srcheckForecast.WriteLine(valueThree);
    }
}

标签: c#linqsorting

解决方案


另一种方法是使用Dictionary数据结构来存储每个帐户的最大天数:

var dictionary = new Dictionary<string, int>();

foreach (var valueTwo in resultTwo)
{
    var valueString = valueTwo.Name.ToString();
    var currentAccount = valueString.Substring(0, valueString.IndexOf('\t'));
    var currentDateTwo = (valueString.Substring((valueString.IndexOf('\t') + 1), 10).Replace("/", ""));
    int currentDate = Convert.ToInt32(currentDateTwo);

    if (!dictionary.TryGetValue(currentAccount, out int value) || currentDate > value)
    {
        dictionary[currentAccount] = currentDate;
    }   
}

// transorm dictionary to List<string> of your form
var forecastTestList = dictionary.Select(x => $"{x.Key + '\t' + x.Value}").ToList();

推荐阅读