С# проверьте, изменилось ли содержимое ref List‹›

Скажем, например, у меня есть это в классе:

List<int> myIntegerList;

public MyClass(ref List<int> intList)
{
    myIntegerList= intList;
}

И это в моем основном классе:

List<int> myIntegerList = new List<int>();
MyClass myNewClass;

for (int i = 0; i < 10; i++)
{
    myIntegerList .Add(Random.Next(0, 100));
}

myNewClass = new MyClass(ref IntegerList);

Есть ли простой способ проверить объект myNewClass, изменилось ли содержимое указанного List<int>? например Если любое из случайных целых чисел в списке изменится, вызовите событие в объекте myNewClass.


person Darthmarshie    schedule 19.01.2017    source источник
comment
Используйте ObservableCollection вместо List. Также не используйте ref. В C# myIntegerList уже является ссылкой на объект. Просто передайте ссылку.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 19.01.2017
comment
Вам не нужно использовать ref. Это понадобится вам только в том случае, если вы хотите присвоить переданный параметр чему-то другому и изменить переменную, которую вы передали.   -  person juharr    schedule 19.01.2017


Ответы (2)


List<T> этого не сделает, а ObservableCollection<T> сделает. Кроме того, не используйте параметр ref в конструкторе; любая переменная C#, ссылающаяся на экземпляр класса, уже является ссылкой. ref параметры типа класса являются ссылкой на ссылку, о которой вы не хотите и, вероятно, не хотите думать.

using System.Collections.ObjectModel;

public class MyClass
{
    private ObservableCollection<int> _integerList;

    //  Do not make this a ref parameter, it's a reference already
    public MyClass(ObservableCollection<int> intList)
    {
        _integerList = intList;
        _integerList.CollectionChanged += _integerList_CollectionChanged;
    }

    private void _integerList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        //  Do stuff here in response to changed values in the list. 

        //  Now back to the reference thing again: int is immutable.
        //  You can't change it, you can only replace it with another 
        //  int. This event will be raised when you do that. 
        //
        //  If the objects in the ObservableCollection are class 
        //  instances rather than ints, they're mutable. You can 
        //  change their properties without replacing them. 
        //  ObservableCollection cannot know when that happens, so 
        //  it can't tell you. 
        //
        //  In that case, you'd need the class to implement 
        //  INotifyPropertyChanged. That's a different can of worms, 
        //  but it's a manageable one. 
    }
}

...

ObservableCollection<int> ints = new ObservableCollection<int>();
MyClass myNewClass;
var r = new Random();

for (int i = 0; i < 10; i++)
{
    ints.Add(r.Next(0, 100));
}

myNewClass = new MyClass(ints);
person 15ee8f99-57ff-4f92-890c-b56153    schedule 19.01.2017
comment
Пришлось обновить кодовую базу 4-летней давности, чтобы она заработала, но оно того стоило. Спасибо! Еще один быстрый вопрос: есть ли способ использовать ref, чтобы убедиться, что при удалении элемента из списка он также удаляется из другого списка? По сути, я хотел бы, чтобы один список содержал ссылку на элемент в другом списке и мог удалять оба одновременно без использования событий. - person Darthmarshie; 20.01.2017
comment
@GryffDavid Это обязательно должны быть два разных объекта коллекции? Это можно сделать, но я бы предпочел сделать это, просто поделившись одной коллекцией. - person 15ee8f99-57ff-4f92-890c-b56153; 20.01.2017
comment
Немного странная ситуация. Это для игры. Второй список должен содержать только несколько элементов из исходного списка, и те же элементы в исходном списке могут быть удалены в любой момент, и мне нужно, чтобы изменение отображалось во втором списке. - person Darthmarshie; 20.01.2017
comment
@GryffDavid Я бы посмотрел на отфильтрованный CollectionView: msdn.microsoft.com/en-us/library/ - person 15ee8f99-57ff-4f92-890c-b56153; 20.01.2017

Используйте ObservableCollection.. перейдите по ссылке ниже для дальнейшего ознакомления

ObservableCollection msdn

person Ankit Agarwal    schedule 19.01.2017