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 の 3 つのキーがあります。したがって、3 つのエントリがあります。これらのキー エントリのそれぞれに、関連付けられたリストがあります。この場合、これら 3 つの数値のそれぞれが、各キーに関連付けられたリスト内に正確に 2 つの CandidateDetails アイテムを持っているとします。これはつまり、異なるセルまたは同じセルに 2 つの 5、2 つの 6、および 2 つの 1 があることを意味します。私が知りたいのですが:

if[5].1stItem.CellId == [6].1stItem.CellId => ヒットしました。つまり、同じセル内に 5 と 6 があることを意味します。if[5].2ndItem.CellId == [6].2ndItem.CellId => 完全です。残りの 5 と 6 は、別のセル内に一緒にあることがわかりました。if[1].1stItem.CellId == ...

ここで、1 を他の 5 および 6 と照合して、前の同じ 2 つのセル内に存在するかどうかを確認する必要があります。

おそらくLinq式が役立つでしょうか?私はここでかなり立ち往生しています...わかりません...多分私は間違ったアプローチを取っています。ゲーム数独の「隠しペア」を解こうとしています。:)

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

どうもありがとう、ケーブ

4

2 に答える 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

于 2010-05-22T02:36:20.667 に答える
0

Process every pair in a sequenceは、リスト内のすべてのペアを処理する方法を示しています

于 2010-05-22T01:28:47.980 に答える