组合多个列表
本文关键字:列表 组合 | 更新日期: 2023-09-27 18:15:27
我有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";
}
}
我需要在这里写一些自定义集合吗?
对
首先将所有项目添加到ObservableCollection<T>
。这将为您提供组合列表。
如果我使用concat,那么如果我从子列表中删除一个项目,父列表将不会更新。
您可以为"组合"集合订阅ObservableCollection<T>.CollectionChanged
事件,然后在发生更改时从适当的后备集合中添加或删除。
使用AddRange和单独调用Add()
你可以对它进行"注释"连接:
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!
使用CompositeCollection。您可以添加任何项,包括其他集合,并且绑定到它的控件将接收到其中所有项的扁平视图。