C# 以不同的方式在wpf网格中搜索子级
我使用的是wpf网格,其中的列和行是从代码隐藏中动态设置的(用户可以更改列和行的数量) 如果我使用foreach循环来定位网格(单元格)中的子对象,它会从“上到下”搜索,意思是从col=0行=0的单元格开始搜索,然后col=0行=1,依此类推。。。我想要的是从“左到右”搜索,即行=0列=0,然后行=0列=1,依此类推 在列表中添加子元素的顺序非常重要 我知道我可以用两个嵌套的for循环来实现,但是有没有更优雅(更快)的方法呢 (单元格是用户控件)C# 以不同的方式在wpf网格中搜索子级,c#,wpf,C#,Wpf,我使用的是wpf网格,其中的列和行是从代码隐藏中动态设置的(用户可以更改列和行的数量) 如果我使用foreach循环来定位网格(单元格)中的子对象,它会从“上到下”搜索,意思是从col=0行=0的单元格开始搜索,然后col=0行=1,依此类推。。。我想要的是从“左到右”搜索,即行=0列=0,然后行=0列=1,依此类推 在列表中添加子元素的顺序非常重要 我知道我可以用两个嵌套的for循环来实现,但是有没有更优雅(更快)的方法呢 (单元格是用户控件) 列表单元格=新列表(); foreach(主网格
列表单元格=新列表();
foreach(主网格中的单元格c.Children)
{
添加(c);
}
//...
对于(int i=0;iGrid.GetRow(c)==i&&Grid.GetColumn(c)==j);
单元格。添加(单元格);
}
}
如果我使用foreach循环定位网格(单元格)中的子对象,它会从“上到下”进行搜索
事实并非如此。它只是按照您将子对象添加到网格的子对象集合的顺序返回子对象,而子对象集合与它们在网格中的位置无关。您碰巧按该顺序获取它们的原因是,它们是按该顺序添加到网格中的
如果您想要一种更“优雅”的方式来实现这一点(虽然可能不会更快),您可以使用linq的OrderBy
和ThenBy
以及附加的Grid.Row
和Grid.Column
属性
List<Cell> cells = mainGrid.Children
.OfType<Cell>()
.OrderBy(Grid.GetRow)
.ThenBy(Grid.GetColumn)
.ToList();
List cells=mainGrid.Children
第()类
.OrderBy(Grid.GetRow)
.ThenBy(Grid.GetColumn)
.ToList();
与您的示例相比,此解决方案还具有一定的健壮性,因为如果有没有单元格的网格行或列,它不会失败。尽管快速访问非常重要,但您可以在插入期间或网格子集合稳定时创建两个索引(行和列)。很抱歉,但是我不知道你的评论是什么意思。评论是针对发布问题的用户的,而不是你。我把它加在这里,因为用更多的东西来完成你的答案似乎很有用。我考虑的是快速提取子对象:您的代码片段提供了一种针对集合的“查询”。但是,如果您希望快速访问某一行的子项,而不首先扫描它们,则可以将它们组织到字典中。这应该在插入过程中发生,因此检索总是非常快的。
List<Cell> cells = mainGrid.Children
.OfType<Cell>()
.OrderBy(Grid.GetRow)
.ThenBy(Grid.GetColumn)
.ToList();