2

我有点卡在这里,无法进一步思考。

public struct CandidateDetail
    {
        public int CellX { get; set; }
        public int CellY { get; set; }
        public int CellId { get; set; }           
    }

var dic = new Dictionary<int, List<CandidateDetail>>();

如何以最有效的方式将每个 CandidateDetail 项目与同一字典中的其他 CandidateDetail 项目进行比较?

示例:字典有三个键:5、6 和 1。因此我们有三个条目。现在这些关键条目中的每一个都有一个与之关联的列表。在这种情况下,假设这三个数字中的每一个在与每个键关联的列表中都有两个 CandidateDetails 项。这意味着换句话说,我们在不同或相同的单元格中有两个 5、两个 6 和两个 1。我想知道:

if[5].1stItem.CellId == [6].1stItem.CellId => 我们成功了。这意味着如果[5].2ndItem.CellId == [6].2ndItem.CellId => 完美,我们在同一个 Cell 中有一个 5 和一个 6。我们发现其他 5 和 6 一起在不同的牢房内。if[1].1stItem.CellId == ...

现在我需要检查 1 和其他 5 和 6 是否存在于前两个单元格中。

Linq 表达式可能有帮助吗?我被困在这里......我不知道......也许我采取了错误的方法。我正在尝试解决游戏数独的“隐藏对”。:)

http://www.sudokusolver.eu/ExplainSolveMethodD.aspx

非常感谢,凯夫

4

2 回答 2

0

处理序列中的每一对显示如何处理列表中的每一对

于 2010-05-22T01:28:47.980 回答
0
from kvp1 in dic
from i1 in Enumerable.Range(0, kvp1.Value.Count)
let candidate1 = kvp1.Value[i2]
from kvp2 in dic
where kvp2.Key >= kvp1.Key
from i2 in Enumerable.Range(0, kvp2.Value.Count)
let candidate2 = kvp2.Value[i2]
where kvp1.Key != kvp2.Key || i2 > i1
where candidate1.CellId == candidate2.CellId
select new { 
  Key1 = kvp1.Key,
  Key2 = kvp2.Key,
  Candidate1 = candidate1,
  Candidate2 = candidate2
}

如果您只想匹配来自不同键的候选者,您可能希望仅针对您想要的信息修改select子句或添加另一个子句。where

于 2010-05-22T02:36:20.667 回答