Foreach嵌套循环不重复
Foreach Nested Loop No Repetition
这是一个很简单的问题,我一直卡在上面。
我有一个 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;
}
});
谁能解决这个问题?
假设我现在理解了这个问题(相对于我的第一个答案),你基本上是在问如何只比较每对元素一次。
我会在 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 开始。
这是一个很简单的问题,我一直卡在上面。
我有一个 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;
}
});
谁能解决这个问题?
假设我现在理解了这个问题(相对于我的第一个答案),你基本上是在问如何只比较每对元素一次。
我会在 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 开始。