Сравнение всех значений в списке друг с другом

Я немного застрял здесь и не могу думать дальше.

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 и 6 в одной и той же ячейке if[5].2ndItem.CellId == [6].2ndItem.CellId => perfect. Мы выяснили, что остальные 5 и 6 находятся вместе в другой ячейке. если[1].1stItem.CellId == ...

Теперь мне нужно проверить 1 также против других 5 и 6, чтобы увидеть, существует ли он в предыдущих двух ячейках или нет.

Может ли выражение Linq помочь? Я совершенно застрял здесь... Я не знаю... Может быть, я использую неправильный подход. Я пытаюсь решить «Скрытую пару» игры Судоку. :)

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

Большое спасибо, Кейв


person Houman    schedule 21.05.2010    source источник


Ответы (2)


Обработка каждой пары в последовательности показывает, как можно обрабатывать каждую пара в списке

person Ian Mercer    schedule 22.05.2010

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, если вы хотите, чтобы совпадали только кандидаты из разных ключей.

person svick    schedule 22.05.2010
comment
Это выбирает каждую пару дважды (c1, c2) и (c2, c1) и выбирает пары, где Candidate1 и Candidate2 являются одним и тем же объектом (c1, c1). - person Ian Mercer; 22.05.2010
comment
Да, ты прав. Я изменил код, но он стал менее читаемым. - person svick; 22.05.2010
comment
Привет, я ценю ответы. Вы уверены, что третья строка верна? пусть кандидат1 = kvp1.Value[i2] Не должно ли быть скорее [i1]? В противном случае он не компилируется. Но все же я не получаю никакого результата, когда весь этот код хранится в перечислимом тесте var. Вроде ничего не находит. Но я должен признать, что я довольно новичок в Linq. - person Houman; 25.05.2010
comment
Ссылка, которую я разместил, показывает более простой способ обработки диагональной матрицы, которая здесь необходима. - person Ian Mercer; 26.05.2010