Вложенный цикл Foreach без повторов

Это очень простая проблема, на которой я застрял.

У меня есть объект IEnumerable IGrouping, в котором сгруппированы общие ключевые элементы. Теперь мне нужно сравнить каждый один и тот же элемент общего ключа в самом объекте IEnumerable IGrouping. Я использовал цикл 2 foreach для достижения этой цели, но проблема в том, что foreach вызывает повторение. Мне нужно зациклить и сравнить каждый элемент без повторения того, который уже прошел.

Parallel.ForEach((sameQuickHashGroups, quickHashGroup) =>
{
    foreach (var groupFile in quickHashGroup)
    {
        foreach (var groupFile2 in quickHashGroup)
        {                               
            if (HashTool.ByteToByteCompare(groupFile.FileName, groupFile2.FileName))
            {
                groupFile.FullHash = count.ToString();
                groupFile2.FullHash = count.ToString();
            }                                                           
         }
         count;
     }
});

Кто-нибудь может решить это?

1 ответ

Решение

Предполагая, что теперь я понимаю вопрос (в отличие от моего первого ответа), вы в основном спрашиваете, как сравнить каждую пару элементов только один раз.

Я бы использовал Линка ToList() на IEnumerable, а затем использовать for петли вместо foreach петли.
Таким образом, вы можете сравнить каждую пару элементов только один раз:

var quickHashGroupList = quickHashGroup.ToList();
for(var i = 0; i < quickHashGroupList.Count-1; i++)
{
    var groupFile = quickHashGroupList[i];
    for(var j = i+1; j < quickHashGroupList.Count; j++)
    {
        var groupFile2 = quickHashGroupList[j];
        if (HashTool.ByteToByteCompare(groupFile.FileName, groupFile2.FileName))
        {
            groupFile.FullHash = count.ToString();
            groupFile2.FullHash = count.ToString();
        }     
    }
}

Обратите внимание, что первый цикл идет только к count-2, так как второй цикл начинается с i+1.

Другие вопросы по тегам