Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以不同的方式在wpf网格中搜索子级_C#_Wpf - Fatal编程技术网

C# 以不同的方式在wpf网格中搜索子级

C# 以不同的方式在wpf网格中搜索子级,c#,wpf,C#,Wpf,我使用的是wpf网格,其中的列和行是从代码隐藏中动态设置的(用户可以更改列和行的数量) 如果我使用foreach循环来定位网格(单元格)中的子对象,它会从“上到下”搜索,意思是从col=0行=0的单元格开始搜索,然后col=0行=1,依此类推。。。我想要的是从“左到右”搜索,即行=0列=0,然后行=0列=1,依此类推 在列表中添加子元素的顺序非常重要 我知道我可以用两个嵌套的for循环来实现,但是有没有更优雅(更快)的方法呢 (单元格是用户控件) 列表单元格=新列表(); foreach(主网格

我使用的是wpf网格,其中的列和行是从代码隐藏中动态设置的(用户可以更改列和行的数量)

如果我使用foreach循环来定位网格(单元格)中的子对象,它会从“上到下”搜索,意思是从col=0行=0的单元格开始搜索,然后col=0行=1,依此类推。。。我想要的是从“左到右”搜索,即行=0列=0,然后行=0列=1,依此类推

在列表中添加子元素的顺序非常重要

我知道我可以用两个嵌套的for循环来实现,但是有没有更优雅(更快)的方法呢

(单元格是用户控件)

列表单元格=新列表();
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();