Перемещение элемента из одного словаря в другой - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть словарь с несколькими парами

Dictionary<DateTime, ObservableCollection<Car>>

и я меняю год производства на Car, и, поскольку Key (DateTime) - это год, мне нужно переместить этот Car со KeyValuePair со старого года на KeyValuePair с Новый год.

так, например, у меня было две пары:

1.1.1997 {Car1,Car2}
1.1.1998 {Car3}

и

Car2.Production = Convert.ToDateTime("1.1.1998");

Мне нужно иметь

1.1.1997 {Car1}
1.1.1998 {Car3,Car2}

Какой самый простой способ добиться этого?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

Кажется, что вы, возможно, захотите вместо этого использовать сгруппированное представление для этих данных, но вот кодовое решение, которое решает вопрос, как указано.Если вы планируете сделать это для более чем одного свойства, я бы рекомендовал сделать наследование Car от DependencyObject или реализовать его из INotifyPropertyChanged вместо создания событий для каждого.

// The car class itself
public class Car
{
    // This event is raised when the production property changes
    public event EventHandler<PropertyValueChange<DateTime>> ProductionChanged;
    DateTime _production; // private data
    public DateTime Production
    {
        get { return _production; }
        set
        {
            if (value == _production) return; // don't raise the event if it didn't change
            var eventArgs = new PropertyValueChange<DateTime>(_production, value);
            _production = value;
            // If anyone is "listening," raise the event
            if (ProductionChanged != null)
                ProductionChanged(this, eventArgs);
        }
    }
}
// Class that contains the dictionary of production to car lists
class Foo
{
    Dictionary<DateTime, ObservableCollection<Car>> ProductionToCars = new Dictionary<DateTime, ObservableCollection<Car>>();

    public void Add(Car c)
    {
        _Add(c);
        // We want to be notified when the car's production changes
        c.ProductionChanged += this.OnCarProductionChanged;
    }
    // This is called when a car's value changes, and moves the car
    void OnCarProductionChanged(object sender, PropertyValueChange<DateTime> e)
    {
        Car c = sender as Car;
        if (c == null) return;
        ProductionToCars[e.OldValue].Remove(c);
        _Add(c);
    }
    // this actually places the car in the (currently correct) group
    private void _Add(Car c)
    {
        ObservableCollection<Car> collection;
        // Find the collection for this car's year
        if (!ProductionToCars.TryGetValue(c.Production, out collection))
        {
            // if we couldn't find it, create it
            collection = new ObservableCollection<Car>();
            ProductionToCars.Add(c.Production, collection);
        }
        // Now place him in the correct collection
        collection.Add(c);
    }

}
// This class encapsulates the information we'll pass when the property value changes
public class PropertyValueChange<T> : EventArgs
{
    public T OldValue;
    public T NewValue;
    public PropertyValueChange(T oldValue, T newValue)
    {
        OldValue = oldValue;
        NewValue = newValue;
    }
}
1 голос
/ 01 февраля 2012

Вам нужен словарь в этом случае?Если вы хотите использовать все машины определенной даты производства, не могли бы вы использовать Linq?

ObservableCollection<Car> cars = new ObservableCollection<Car>();
var car1 = new Car() { Model = "Ford", ProductionDate = new DateTime(1997, 01, 01)} );
var car2 = new Car() { Model = "Chevy", ProductionDate = new DateTime(1997, 01, 01)} );
var car3 = new Car() { Model = "Ford", ProductionDate = new DateTime(2002, 01, 01)} );
cars.Add(car1);
cars.Add(car2);
cars.Add(car3);

var carsIn1997 = cars.Where(x => x.ProductionDate.Year == 1997);
var carsThatAreFords = cars.Where(x => x.Model == "Ford");
var groupedCars = cars.GroupBy(x => x.ProductionDate);

Используя этот метод, вы можете получить доступ ко всем автомобилям за определенный год, модель и т. Д. ... и манипулировать данными, не беспокоясь о перемещении ссылок и т. Д. ...

Дляобщее руководство по GroupBy, см. здесь

1 голос
/ 01 февраля 2012

Это должно работать (не самый короткий код, но простой для понимания):

private static void EnsureValuesAreCoherent(Dictionary<DateTime, ObservableCollection<Car>> param)
{
    List<Car> toMove = new List<Car>();
    foreach (KeyValuePair<DateTime, ObservableCollection<Car>> pair in param)
    {
        List<Car> toRemove = new List<Car>();
        foreach (Car car in pair.Value)
        {
            if (car.Production != pair.Key)
            {
                toRemove.Add(car);
            }
        }

        foreach (Car car in toRemove)
        {
            pair.Value.Remove(car);
            toMove.Add(car);
        }
    }

    foreach (Car car in toMove)
    {
        ObservableCollection<Car> currentCollection;
        if (param.TryGetValue(car.Production, out currentCollection))
        {
            currentCollection.Add(car);
        }
    }
}

Но ИМО - плохая идея иметь такую ​​зависимость между ключом словаря и членом значений словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...