Foreach嵌套循环不重复

时间:2017-11-21 10:31:52

标签: c# foreach ienumerable repeat igrouping

这是一个我一直坚持的非常容易的问题。

我有一个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 个答案:

答案 0 :(得分:0)

假设我现在理解了这个问题(与我的第一个答案相同),你基本上只是要问如何比较每对元素一次。

我会在IEnumerable上使用Linq的ToList(),然后使用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开始。