Вложенный цикл 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.