управление элементами в Списке на основе некоторых условий в C# - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть пара списков List<OldData> oldItems = new List<OldData>(); и List<NewData> newItems = new List<NewData>();

. Я пытаюсь достичь этой цели, чтобы избежать возможности появления избыточных данных и проверки некоторых условий перед добавлением значений. в список.

Сначала в oldItems у меня будут храниться некоторые значения, а в списке newItems у меня будет храниться совершенно другой набор значений, но это всегда может быть случай, когда список newItems может иметь некоторые значения, которые уже существуют в списке oldItems .

Две используемые переменные - это Name переменная и path переменная, в которой хранится определенный путь

Итак, сначала я хочу проверить, есть ли какие-либо значения, где имя в старом Списке предметов равно имени в новом Списке предметов, если есть элемент, который я хочу проверить, совпадают ли соответствующие переменные Path соответствующих элементов,

, если он совпадает, я могу просто сохранить этот элемент в том же виде, что и в OldIte. ms ms list, если это окажется другим, я удалю это из старого списка предметов (и позже использую предмет в новом списке предметов)

Так что все вышеперечисленное в скорлупе ореха,

Я хочу проверить в старом списке элементов, где есть имя, соответствующее ему в новом списке элементов. Если есть, я хочу проверить, соответствуют ли соответствующие значения в переменной Path для двух элементов с одинаковым именем из два списка одинаковы или различны

Я сделал простое фиктивное приложение для демонстрации этого, но действительно застрял на том, как я могу реализовать логи c

любое предложение?

class Program
{
    static void Main(string[] args)
    {

        List<OldData> oldItems = new List<OldData>();

        OldData oldData1 = new OldData();
        oldData1.Name = "Test01";
        oldData1.OriginalPath = "D:/Temp01";

        oldItems.Add(oldData1);


        OldData oldData2 = new OldData();
        oldData1.Name = "Test02";
        oldData1.OriginalPath = "D:/Temp02";
        oldItems.Add(oldData2);


        List<NewData> newItems = new List<NewData>();

        NewData newData1 = new NewData();
        newData1.Name = "Test01";
        newData1.OriginalPath = "D:/Temp01";

        newItems.Add(newData1);

        NewData newData2 = new NewData();
        oldData1.Name = "Test05";
        oldData1.OriginalPath = "D:/Temp05";
        newItems.Add(newData2);

        foreach (var item in oldItems)
        {
            //Check if there are any Names which are same from the new Item list
            //If if there is such an item check if the OriginalPath variable is the same iin both
            //If yes => Remove that particular item from the Old data List 
            //If Not => Keep that Item in  the old data List
        }
    }
}

class OldData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
}

class NewData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
}

В этом случае, поскольку значение Test01 является общим для обоих списков, оно проверит, являются ли значения переменных пути, соответствующие обоим элементам, одинаковыми или нет

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

Ваше фиктивное приложение использует тот же объект (oldData1).

Пожалуйста, используйте приведенный ниже код, используя простой LINQ.

class Program
{
    static void Main(string[] args)
    {
        List<OldData> oldItems = new List<OldData>();

        OldData oldData1 = new OldData();
        oldData1.Name = "Test01";
        oldData1.OriginalPath = "D:/Temp01";

        oldItems.Add(oldData1);


        OldData oldData2 = new OldData();
        oldData2.Name = "Test02";
        oldData2.OriginalPath = "D:/Temp02";
        oldItems.Add(oldData2);


        List<NewData> newItems = new List<NewData>();

        NewData newData1 = new NewData();
        newData1.Name = "Test01";
        newData1.OriginalPath = "D:/Temp01";

        newItems.Add(newData1);

        NewData newData2 = new NewData();
        newData2.Name = "Test05";
        newData2.OriginalPath = "D:/Temp05";
        newItems.Add(newData2);


        oldItems = oldItems.Where(x => newItems != null && !newItems.Any(y => x.Name == y.Name && x.OriginalPath == y.OriginalPath)).ToList();

    }
}

class OldData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
}

class NewData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
}
0 голосов
/ 17 февраля 2020

1) Я бы реализовал interface с общими свойствами

2) Мы заставляем оба класса реализовать его (что уже сделано в любом случае)

3) Мы реализуем EqualityComparer для спецификатора c interface, который будет проверять только те свойства, которые мы хотим получить от обоих объектов, реализующих нашу interface

Это пример реализации:

class Program
{
    static void Main(string[] args)
    {
        OldData oldData = new OldData
        {
            Name = "Pizza",
            OriginalPath = "Pozza"
        };

        NewData newData = new NewData
        {
            Name = "Pizza",
            OriginalPath = "Pozza"
        };

        var comparer = new CommonDataComparer();

        bool areEqual = comparer.Equals(oldData, newData);

        Console.WriteLine(areEqual);
    }
}

public interface ICommonData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
}

public class OldData : ICommonData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
    //Old other properties
}

public class NewData : ICommonData
{
    public string Name { get; set; }
    public string OriginalPath { get; set; }
    //New other properties
}

public class CommonDataComparer : IEqualityComparer<ICommonData>
{
    public bool Equals([AllowNull] ICommonData x, [AllowNull] ICommonData y)
    {
        return ((x?.Name == y?.Name) && (x?.OriginalPath == y?.OriginalPath));
    }

    public int GetHashCode([DisallowNull] ICommonData obj)
    {
        return obj.Name.GetHashCode() + obj.OriginalPath.GetHashCode();
    }
}

Вывод:

True

0 голосов
/ 17 февраля 2020

Вы сравниваете строки, чтобы оператор == работал нормально.

Вот простой ответ без использования LINQ. Просто foreach l oop с 2 условиями:

    for (int i = oldItems.Count - 1; i >= 0; i--)
    {
        OldData currentOldItem = oldItems[i] as OldData;
        foreach (var newItem in newItems) {
            if (currentOldItem.Name == newItem.Name) {
                if (currentOldItem.OriginalPath == newItem.OriginalPath) {
                    oldItems.RemoveAt(i);
                } 
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...