C#的foreach问题
是否C#
提供的东西以下代码(在重构计算):C#的foreach问题
我希望能够通过一个调用来替代两个的foreach调用像for every (x, x) possible pair
,可这做完了?
foreach (var image1 in sequence.Images)
{
foreach (var image2 in sequence.Images)
{
if (image1 != image2)
{
metric.SetImageMetric(new ImagePair(image1, image2), 1.0);
}
}
}
Zip方法不会给出两个列表之间的所有可能的排列方式。 – Femaref 2011-03-27 23:00:28
Zip在这里不起作用,因为@Yippie想要所有可能的图像配对,除非两个图像相同。 – 2011-03-27 23:02:36
原帖用zip标记了这个,我认为应该是产品。我重新标记了。 – 2011-03-27 23:02:52
foreach(var pair in sequence.Images
.Select(im1 =>
sequence.Images.Select(im2 => Tuple.Create(im1, im2))
.Where(pair => pair.Item1 != pair.Item2))
{
metric.SetImageMetric(new ImagePair(pair.Item1, pair.Item2), 1.0);
}
我认为原来的代码更好。 – 2011-03-27 23:03:51
我同意。然而,这个问题需要一个电话。我在LINQ中链接到了Eric Lippert的笛卡尔产品,因此我喜欢这个答案,因为这应该是最简单最漂亮的方法。 – Femaref 2011-03-27 23:04:52
效率不高:
var permutations = sequence.Images.SelectMany (image1 => sequence.Images.Where (image2 => image1 != image2).Select(image2 => new ImagePair (image1, image2)));
我倾向于将它分解为两个阶段。首先,查询产生对所需的序列,和第二,在序列的foreach:
var pairs = from image1 in sequence.Images
from image2 in sequence.Images
where image1 != image2
select new ImagePair(image1, image2);
foreach(var pair in pairs)
metric.SetImageMetric(pair, 1.0);
我有一种感觉,这个问题可以通过LINQ来回答,但我对此一无所知。 – eternalmatt 2011-03-27 22:58:31
我想你想要一个电话来执行完整的笛卡尔产品。你实际上并不是在寻找Image1!= Image2测试来包含在这个单独的调用中,还是你? – 2011-03-27 23:06:56