Лучший алгоритм для синхронизации двух IList в C# 2.0

Вы должны действительно сосредоточиться на очистке своего кода. Это поможет вам легче отлаживать и будет более вежливым, когда вы будете задавать вопросы. Трудно понять, что именно вы пытаетесь сделать, но при использовании library(ggridges) ваше значение x должно быть числовым, а значение y должно быть категоричным.

Кроме того, поскольку вы используете ggplot2, вам не нужно использовать синтаксис data$column_name при создании графика. Вот пример с использованием iris ниже.

library(tidyverse)
library(ggridges)
#> 
#> Attaching package: 'ggridges'
#> The following object is masked from 'package:ggplot2':
#> 
#>     scale_discrete_manual


iris %>% 
  ggplot(aes(x = Sepal.Length, y = Species)) + 
  geom_density_ridges()
#> Picking joint bandwidth of 0.181

Создано в 2019-01-19 с помощью пакета представитель (v0.2.1) sup>

11
задан Romain Verdier 2 October 2008 в 10:17
поделиться

5 ответов

Для запуска я избавился бы от изменяемой структуры. Изменяемые типы значения являются существенно плохой вещью. (Как общедоступные поля, IMO.)

Вероятно, стоит создать Словарь, таким образом, можно легко сравнить содержание двух списков. После того как у Вас есть тот простой способ проверить на присутствие/отсутствие, остальные должны быть простыми.

Чтобы быть честными, хотя, это походит, Вы в основном хотите, чтобы L2 был полной копией L1... очищают L2 и просто называют AddRange? Или точка то, что Вы также хотите принять другие меры при изменении L2?

5
ответ дан 3 December 2019 в 10:45
поделиться

В дополнение к комментарию Jon Skeet делают Вашу структуру Учетной записи классом и переопределяют Равняние () и GetHashCode () метод для получения хорошей проверки равенства.

0
ответ дан 3 December 2019 в 10:45
поделиться

Если Ваши два списка отсортированы, то можно просто идти через них в тандеме. Это - O (m+n) операция. Следующий код мог помочь:

class Program
{
    static void Main()
    {
        List<string> left = new List<string> { "Alice", "Charles", "Derek" };
        List<string> right = new List<string> { "Bob", "Charles", "Ernie" };

        EnumerableExtensions.CompareSortedCollections(left, right, StringComparer.CurrentCultureIgnoreCase,
            s => Console.WriteLine("Left: " + s), s => Console.WriteLine("Right: " + s), (x,y) => Console.WriteLine("Both: " + x + y));
    }
}

static class EnumerableExtensions
{
    public static void CompareSortedCollections<T>(IEnumerable<T> source, IEnumerable<T> destination, IComparer<T> comparer, Action<T> onLeftOnly, Action<T> onRightOnly, Action<T, T> onBoth)
    {
        EnumerableIterator<T> sourceIterator = new EnumerableIterator<T>(source);
        EnumerableIterator<T> destinationIterator = new EnumerableIterator<T>(destination);

        while (sourceIterator.HasCurrent && destinationIterator.HasCurrent)
        {
            // While LHS < RHS, the items in LHS aren't in RHS
            while (sourceIterator.HasCurrent && (comparer.Compare(sourceIterator.Current, destinationIterator.Current) < 0))
            {
                onLeftOnly(sourceIterator.Current);
                sourceIterator.MoveNext();
            }

            // While RHS < LHS, the items in RHS aren't in LHS
            while (sourceIterator.HasCurrent && destinationIterator.HasCurrent && (comparer.Compare(sourceIterator.Current, destinationIterator.Current) > 0))
            {
                onRightOnly(destinationIterator.Current);
                destinationIterator.MoveNext();
            }

            // While LHS==RHS, the items are in both
            while (sourceIterator.HasCurrent && destinationIterator.HasCurrent && (comparer.Compare(sourceIterator.Current, destinationIterator.Current) == 0))
            {
                onBoth(sourceIterator.Current, destinationIterator.Current);
                sourceIterator.MoveNext();
                destinationIterator.MoveNext();
            }
        }

        // Mop up.
        while (sourceIterator.HasCurrent)
        {
            onLeftOnly(sourceIterator.Current);
            sourceIterator.MoveNext();
        }

        while (destinationIterator.HasCurrent)
        {
            onRightOnly(destinationIterator.Current);
            destinationIterator.MoveNext();
        }
    }
}

internal class EnumerableIterator<T>
{
    private readonly IEnumerator<T> _enumerator;

    public EnumerableIterator(IEnumerable<T> enumerable)
    {
        _enumerator = enumerable.GetEnumerator();
        MoveNext();
    }

    public bool HasCurrent { get; private set; }

    public T Current
    {
        get { return _enumerator.Current; }
    }

    public void MoveNext()
    {
        HasCurrent = _enumerator.MoveNext();
    }
}

Необходимо будет быть осторожны относительно изменения наборов при итерации по ним, все же.

Если они не отсортированы, то сравнение каждого элемента в одном с каждым элементом в другом является O (млн), которые становятся болезненными действительно быстро.

Если можно перенести для копирования значений ключа с каждого набора в Словарь или подобный (т.е. набор с приемлемой производительностью при выяснении "X существует?"), затем Вы могли придумать что-то разумное.

2
ответ дан 3 December 2019 в 10:45
поделиться

L2 = L1.clone ()?

... но я предположил бы, что Вы забыли упоминать что-то.

0
ответ дан 3 December 2019 в 10:45
поделиться

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

AutoMapper

0
ответ дан 3 December 2019 в 10:45
поделиться