组合多个列表

时间:2011-11-20 23:05:35

标签: c# list data-binding join

我有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 个答案:

答案 0 :(得分:2)

首先将所有项目添加到ObservableCollection<T>。这将为您提供组合列表。

  

如果我使用concat,那么如果删除子列表中的项目,则不会更新父列表。

您可以订阅“合并”集合的ObservableCollection<T>.CollectionChanged事件,然后在发生更改时从相应的支持集合中添加或删除。

答案 1 :(得分:0)

使用AddRange与对Add()的单独调用

或者,只需要一个集合可以被所有线程访问,并从每个线程添加到它,而不是组合5个单独的集合。

答案 2 :(得分:0)

你可以对它进行“注释”连接:

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!

答案 3 :(得分:0)

只需使用CompositeCollection即可。您可以添加任何项目,包括其他集合,绑定到它的控件将收到其中所有项目的展平视图。