将List中的所有值相互比较

时间:2010-05-21 23:13:26

标签: c# sudoku

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

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.因此我们有三个条目。现在,每个关键条目都有一个与之关联的List。在这种情况下,假设这三个数字中的每一个在与每个键相关联的列表中具有恰好两个CandidateDetails项。换句话说,这意味着我们在不同或相同的单元格中有两个5,两个6和两个1。我想知道:

if [5] .1stItem.CellId == [6] .1stItem.CellId =&gt;我们受到了打击。这意味着我们在同一个Cell中有一个5和6 if [5] .2ndItem.CellId == [6] .2ndItem.CellId =&gt;完善。我们发现其他5和6 在一个不同的细胞内。 if [1] .1stItem.CellId == ...

现在我需要检查1对照其他5和6以查看是否存在于前一个相同的两个单元格中。

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

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

非常感谢, 卡瓦

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Process every pair in a sequence显示了如何处理列表中的每一对

答案 2 :(得分: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子句。