Объединение нескольких списков - PullRequest
2 голосов
/ 21 ноября 2011

У меня есть 5 наборов списков, которые мне понадобятся для запуска 5 разных потоков, обрабатывающих эти 5 списков.Я также хочу показать прогресс по ним в таблице данных, для которой требуется один «объединенный» список для привязки.

Не уверен, с чего начать.Если я использую concat, то, если я удалю элемент в подсписке, родительский список не будет обновлен.

public partial class MainWindow : Window
{


    ObservableCollection<TestObject> _combinedList = new ObservableCollection<TestObject>();
    public ObservableCollection<TestObject> CombinedList
    {
        get
        {
            return _combinedList;
        }
        set
        {
            _combinedList = value;
        }
    }


    List<TestObject> _list1 = new List<TestObject>();
    List<TestObject> _list2 = new List<TestObject>();
    List<TestObject> _list3 = new List<TestObject>();
    List<TestObject> _list4 = new List<TestObject>();
    List<TestObject> _list5 = new List<TestObject>();


    public MainWindow()
    {
        InitializeComponent();

        dataGridCombined.ItemsSource = CombinedList;

    }

    private void cmdCreateLists_Click(object sender, RoutedEventArgs e)
    {
        createLists();
    }

    public void createLists()
    {
        for (int i = 1; i < 6; i++)
        {
            _list1.Add(new TestObject(i));
        }

        for (int i = 1; i < 6; i++)
        {
            _list2.Add(new TestObject(i*3));
        }

        for (int i = 1; i < 6; i++)
        {
            _list3.Add(new TestObject(i*5));
        }

        for (int i = 1; i < 6; i++)
        {
            _list4.Add(new TestObject(i*7));
        }

        for (int i = 1; i < 6; i++)
        {
            _list5.Add(new TestObject(i*9));
        }

    }

    private void cmdMergeLists_Click(object sender, RoutedEventArgs e)
    {
        //Doesn't work and if i remove item from sublist, CombinedList doesn't update.
        CombinedList = _list1.Concat<TestObject>(_list2);


    }

}

public class TestObject : BindableObject
{
    private int _number;
    public int Number
    {
        get
        {
            return _number;
        }
        set
        {
            _number = value;
            RaisePropertyChanged("Number");
        }
    }

    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
            RaisePropertyChanged("Name");
        }
    }

    public TestObject(int inNum)
    {
        _number = inNum;
        _name = "John";
    }

}

Должен ли я написать здесь какую-то собственную коллекцию?

Привет

Ответы [ 4 ]

2 голосов
/ 21 ноября 2011

Начните с добавления всех элементов в ObservableCollection<T>. Это предоставит вам объединенный список.

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

Вы можете подписаться на событие ObservableCollection<T>.CollectionChanged для «комбинированной» коллекции, а затем добавлять или удалять из соответствующей резервной коллекции по мере изменения.

0 голосов
/ 21 ноября 2011

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

0 голосов
/ 21 ноября 2011

Вы можете сделать его «аннотированное» объединение:

var combined = list1.Select(i => new {
        Item = i,
        Origin = list1 }).Concat(
  list2.Select(i => new {
        Item = i,
        Origin = list2 }))
 .ToList(); // TODO extend for more lists

Таким образом, вы можете получить список источников предметов:

combined[13].Origin.Remove(combined[13]);
// refresh combined list!
0 голосов
/ 21 ноября 2011

Использовать AddRange против отдельных вызовов Add ()

Или просто иметь одну коллекцию, доступную для всех потоков, и добавлять к ней из каждой из них вместо объединения 5 отдельных коллекций.

...