C# 在C中使用LINQ获得数独板中的3x3组#

C# 在C中使用LINQ获得数独板中的3x3组#,c#,linq,C#,Linq,我试图制作一个程序,检查给定的数独板是否有效(正确求解)。 我也想使用linq来实现这一点,但是我发现很难找到一个解决方案来从电路板上获得所有3x3组。 我希望将它们作为IEnumerable获取,因为我是如何编写其余代码的。 到目前为止,我的解决方案如下: public static bool IsValidSudoku(IEnumerable<IEnumerable<int>> sudokuBoard) { if (sudoku

我试图制作一个程序,检查给定的数独板是否有效(正确求解)。 我也想使用linq来实现这一点,但是我发现很难找到一个解决方案来从电路板上获得所有3x3组。 我希望将它们作为
IEnumerable
获取,因为我是如何编写其余代码的。 到目前为止,我的解决方案如下:

public static bool IsValidSudoku(IEnumerable<IEnumerable<int>> sudokuBoard)
        {
            if (sudokuBoard == null)
            {
                throw new ArgumentNullException();
            }

            var columns = Enumerable.Range(0, 9)
                .Select(lineCount => Enumerable.Range(0,9)
                .Select(columnCount=>sudokuBoard
                    .ElementAt(columnCount)
                    .ElementAt(lineCount)
                    ));

            var groups = //this is where I got stuck
                
            return columns.All(IsValidGroup) &&
                sudokuBoard.All(IsValidGroup) &&
                groups.All(IsValidGroup);
        }

        static bool IsValidGroup(IEnumerable<int> group)
        {
            return group.Distinct().Count() == group.Count()&&
                   group.All(x => x <= 9 && x > 0)&&
                   group.Count() == 9;
        }
public static bool IsValidSudoku(IEnumerable sudokuBoard)
{
if(sudokuBoard==null)
{
抛出新ArgumentNullException();
}
变量列=可枚举的范围(0,9)
.选择(lineCount=>Enumerable.Range(0,9)
.选择(columnCount=>sudokuBoard
.ElementAt(列计数)
.ElementAt(行计数)
));
var groups=//这就是我被卡住的地方
返回列.All(IsValidGroup)&&
sudokuBoard.All(IsValidGroup)&&
组。全部(IsValidGroup);
}
静态布尔IsValidGroup(IEnumerable组)
{
返回组.Distinct().Count()==group.Count()&&
全部组(x=>x0)&&
group.Count()==9;
}
性能在这里并不重要。
谢谢你的建议

您需要两个枚举数来选择要选择的3x3组,然后可以使用.Skip和.Take来运行三个元素来获取这些组

var groups = Enumerable.Range(0, 3).SelectMany(gy =>
             Enumerable.Range(0, 3).Select(gx =>
                 // We now have gx and gy 0-2; find the three rows we want
                 sudoBoard.Skip(gy * 3).Take(3).Select(row =>
                     // and from each row take the three columns
                     row.Skip(gx * 3).Take(3)
                 )
             ));

这将根据请求为您提供
IEnumerable
IEnumerable
s。但是,要将每个组传递给IsValidGroup,您必须将3x3
IEnumerable
展平为9长
IEnumerable
s,例如
groups.Select(group=>group.SelectMany(n=>n))

您可能需要两个枚举范围0-2作为组的x和y索引(即您想要的3x3平方),然后再增加两个0-2的范围来收集组中的元素。但实际上,您需要通过索引访问正方形,因此将板作为列表(而不是可枚举的)或2D int数组可能更简单。(或者我猜这是‘性能不重要’的要点?)我正在测试包含9个数组的数组,这些数组代表数独板的行,所以要通过索引访问,我可以使用ElementAt。我只是无法理解这样做的逻辑。。。