将控件集合与列表进行比较

时间:2012-12-19 16:15:39

标签: c# list controls

我有一个FlowLayoutPanel,我想用ID(字符串)列表和当前进度条(整数)的位置用ProgressBars更新。此列表我将调用列表 a

应将FlowLayoutPanel.Controls与列表 a

进行比较
  • 如果检测到新ID,则应创建一个新的Control 具有该ID(名称)的FlowLayoutPanel.Controls集合。
  • 如果FlowLayoutPanel.Controls集合中的控件在列表 a 中没有相应的名称,则应将其删除并处理。
  • 应更新两个集合中的控件(ProgressBar从列表 a 中的整数进度)

让我感到困扰的是,FlowLayoutPanel.Controls集合没有通用列表那么多的方法,因此我无法真正遵循互联网上的任何指南。

你能帮我解决这个问题吗?

谢谢!

编辑:回复DJ KRAZE评论: 我已经使用列表创建了类似的东西,但正如我所说,Control集合没有像Lists那样的一些方法。这是我的代码(可能不起作用,我重新编写它以使其更容易理解):

//删除旧

// Make a new list of IDs, where none of the IDs from myList1 can be found in myList2
var remove = myList1.Where(f => !myList2.Any(g => g == f.ID));

//Do some operation for the object which is about to get removed
foreach (Object obj in remove)
{
    // Some operation           
}
// remove from list
myList1.RemoveAll(i => remove.Contains(i));

//删除重复项

// Remove Duplicates from myList2, so only the remaining object are to be started
myList2.RemoveAll(f => myList2.Any(g => g.ID == f));

//将myList2中剩余的对象添加到myList1

foreach(Object obj in myList2)
{
// add to myList1 and do some operation, like starting it
}

2 个答案:

答案 0 :(得分:3)

为所有扩展方法添加System.Linq

答案 1 :(得分:1)

FlowLayoutPanel(以及其他容器控件)的控件集合不实现IEnumerable<T>,而只实现非通用IEnumerable。使用IEnumerable exension方法将IEnumerable<T>转换为Cast<T>。然后你可以使用所有充足的LINQ:

 flowLayoutPanel1.Controls
     .Cast<Control>()
     .Where(c => c.Name == "...")
     .OrderBy(...)
     ...

注意:大多数LINQ扩展方法都扩展为IEnumerable<T>