Какой набор .NET для добавления нескольких объектов сразу и быть уведомленным?

Согласно http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html формат «yyyy / mm / dd» решает обычные проблемы , Он говорит: «Придерживайтесь« YYYY / MM / DD »для строк даты, когда это возможно. Это универсально поддерживается и недвусмысленно. В этом формате все времена являются локальными». Я установил тесты: http://jsfiddle.net/jlanus/ND2Qg/432/ Этот формат: + избегает двусмысленности порядка дня и месяца, используя порядок ymd и 4-значный год + избегает UTC против локальной проблемы, не соответствующей формату ISO, с помощью косой черты + danvk, dygraphs , говорит, что этот формат хорош во всех браузерах.

34
задан Community 23 May 2017 в 12:01
поделиться

9 ответов

Дополнительный Человек Метода к спасению!

    /// <summary>
    /// Adds all given items to the collection
    /// </summary>
    /// <param name="collection">The collection.</param>
    /// <param name="toAdd">Objects to add.</param>
    public static void AddAll<T>(this IList<T> collection, params T[] toAdd)
    {
        foreach (var o in toAdd)
            collection.Add(o);
    }
0
ответ дан Will 10 October 2019 в 21:10
поделиться

Кажется, что эти INotifyCollectionChanged интерфейс допускает обновление, когда несколько объектов были добавлены, таким образом, я не уверен, почему ObservableCollection<T> не имеет AddRange. Вы могли сделать дополнительный метод для AddRange, но это вызовет событие для каждого объекта, который добавляется. Если это не приемлемо, необходимо быть в состоянии наследоваться от ObservableCollection<T> следующим образом:

public class MyObservableCollection<T> : ObservableCollection<T>
{
    // matching constructors ...

    bool isInAddRange = false;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        // intercept this when it gets called inside the AddRange method.
        if (!isInAddRange) 
            base.OnCollectionChanged(e);
    }


    public void AddRange(IEnumerable<T> items)
    {
         isInAddRange = true;
         foreach (T item in items)
            Add(item);
         isInAddRange = false;

         var e = new NotifyCollectionChangedEventArgs(
             NotifyCollectionChangedAction.Add,
             items.ToList());
         base.OnCollectionChanged(e);
    }
}
19
ответ дан fryguybob 27 November 2019 в 17:07
поделиться

Хорошо идея - то же как тот из fryguybob - довольно странный, что ObservableCollection отчасти полусделан. Событие args для этой вещи даже не использует Дженериков.. создание меня использовать IList (это так.. вчера:) Протестированный Отрывок следует...

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

namespace MyNamespace
{
    public class ObservableCollectionWithBatchUpdates<T> : ObservableCollection<T>
    {
        public void AddRange(ICollection<T> obNewItems)
        {
            IList<T> obAddedItems = new List<T>();
            foreach (T obItem in obNewItems)
            {
                Items.Add(obItem);
                obAddedItems.Add(obItem);
            }
            NotifyCollectionChangedEventArgs obEvtArgs = new NotifyCollectionChangedEventArgs(
               NotifyCollectionChangedAction.Add, 
               obAddedItems as System.Collections.IList);
            base.OnCollectionChanged(obEvtArgs);
        }

    }
}
6
ответ дан Gishu 27 November 2019 в 17:07
поделиться

Мало того, что System.Collections.ObjectModel.Collection<T> хорошая ставка, но и в документах справки, существует пример из как переопределить его различные защищенные методы для получения уведомления. (Прокрутите вниз к Примеру 2.)

4
ответ дан Ryan Lundy 27 November 2019 в 17:07
поделиться

Если Вы желаете наследоваться какому-то набору, Вы - вероятно, более обеспеченное наследование от Системы. Наборы. ObjectModel. Набор, потому что это предоставляет виртуальные методы для переопределения. Вы будете иметь к теневым методам прочь Списка, если Вы пойдете тем путем.

я не знаю ни о каких встроенных наборах, которые обеспечивают эту функциональность, хотя я приветствовал бы быть исправленным:)

2
ответ дан David Mohundro 27 November 2019 в 17:07
поделиться

Наследуйтесь List< T> и переопределение Добавление () и AddRange () методы, чтобы сгенерировать событие?

1
ответ дан Joel Coehoorn 27 November 2019 в 17:07
поделиться

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

NotSupportedException
   at System.Windows.Data.ListCollectionView.ValidateCollectionChangedEventArgs(NotifyCollectionChangedEventArgs e)
   at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)

Реализация, которую я использовал, использует событие Reset, которое более равномерно реализовано во фреймворке WPF:

    public void AddRange(IEnumerable<T> collection)
    {
        foreach (var i in collection) Items.Add(i);
        OnPropertyChanged("Count");
        OnPropertyChanged("Item[]");
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
4
ответ дан 27 November 2019 в 17:07
поделиться

Взгляните на коллекцию Observable с методами диапазона AddRange, RemoveRange и Replace в C # и VB.

В VB: реализация INotifyCollectionChanging.

0
ответ дан 27 November 2019 в 17:07
поделиться

Для быстрого добавления вы можете использовать:

((List<Person>)this.Items).AddRange(NewItems);
0
ответ дан 27 November 2019 в 17:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: