L oop через список и сравнить предыдущую строку с текущей строкой. У меня есть список номеров счетов в основном дубликатов - PullRequest
0 голосов
/ 27 марта 2020

Мой второй результат - список номеров счетов и дат, которые я добавил из другого списка с помощью 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);
    }
}

1 Ответ

0 голосов
/ 27 марта 2020

Альтернативный подход заключается в использовании словаря структуры данных для хранения максимального дня для каждой учетной записи:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...