Объединение совпадающих значений из двух наблюдаемых коллекций в третью [WPF] - PullRequest
0 голосов
/ 16 июня 2020

Здравствуйте, у меня есть один ObservableCollection, который выглядит так:

new time { Arrival = stringlist[0], Departure = stringList[1]};
new time2 { Arrived = stringlist[0], Departed = stringList[1]};

Я хотел бы создать новый ObservableCollection с именем datagridTime и вставить только в него ObservableCollection записи, которые совпадают, допустим, у нас есть

Time `ObservableCollection`

Arrival   |     Departure
---------------------------------
10                 20
10                 30
10                 10
Time2 `ObservableCollection`

Arrival   |     Departure
---------------------------------
10                 20
10                 30
10                 20
datagridTime `ObservableCollection`

Arrived   |     Departed
---------------------------------
10                 20
10                 30

Ответы [ 4 ]

3 голосов
/ 16 июня 2020

Вы можете использовать метод Intersect() Linq, но вам нужно будет реализовать EqualityComparer на ваших Time объектах

Здесь у вас есть документы: https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.intersect?view=netcore-3.1

0 голосов
/ 17 июня 2020

Вот небольшой пример приложения, которое должно делать то, что вы хотите.

Часть magi c такова:

public ObservableCollection<Person> People1 { get; } = new ObservableCollection<Person>()
{
    new Person("Donald", "Duck"),
    new Person("Daisy", "Duck"),
    new Person("Jack", "Daniels")
};

public ObservableCollection<Person> People2 { get; } = new ObservableCollection<Person>()
{
    new Person("Donald", "Duck"),
    new Person("Daisy", "Duck"),
    new Person("Jim", "Beam")
};

public IEnumerable<Person> PeopleInBothCollections
{
    get
    {
        foreach (var person in People1)
        {
            if (People2.Any(x => x.FirstName == person.FirstName && x.LastName == person.LastName))
            {
                yield return person;
            }
        }
    }
}

Когда вы поднимете событие PropertyChanged, он должен обновить ваш третий список: enter image description here

А вот ссылка на пример: https://github.com/timunie/MahApps.Metro.Examples/tree/master/src/MahApps.Metro.Examples/IntersectTwoLists

0 голосов
/ 17 июня 2020

Join может использоваться для решения этой проблемы. Это решение для объединения двух коллекций по некоторому условию. В вашем случае вы можете заменить левую и правую анонимную коллекцию на ObservableCollection

        var left = new[] {
            new { Arrival = 10, Departure = 20 },
            new { Arrival = 10, Departure = 30 },
            new { Arrival = 10, Departure = 10 }
        };

        //This collection contains duplicates hence needs to be removed either before or later joining the collection.

        var right = new[] {
            new { Arrival = 10, Departure = 20 },
            new { Arrival = 10, Departure = 30 },
            new { Arrival = 10, Departure = 20 }
        };

        var result =
                    left.Distinct() //remove duplicates
                    .Join(right.Distinct(), // Remove duplicates
                            right => new { right.Arrival, right.Departure },
                            left => new { left.Arrival, left.Departure },
                            (l, r) => new { r, l } // Matching elements in both collections use can return either of noth
                        ).ToList();//To list is called to execute the query and get result

Призываем проверить больше здесь

0 голосов
/ 16 июня 2020

Это должно работать:

var time1 = new { Arrived = new List<string>(), 
                  Departure = new List<string>() };
var time2 = new { Arrived = new List<string>(), 
                  Departure = new List<string>() };

var time3 = new{ Arrived = time1.Arrived.Intersect(time2.Arrived),
                 Departure = time1.Departure.Intersect(time2.Departure) };
...