2011-03-27 62 views
1

是否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); 
     } 
    } 
} 
+0

我有一种感觉,这个问题可以通过LINQ来回答,但我对此一无所知。 – eternalmatt 2011-03-27 22:58:31

+0

我想你想要一个电话来执行完整的笛卡尔产品。你实际上并不是在寻找Image1!= Image2测试来包含在这个单独的调用中,还是你? – 2011-03-27 23:06:56

回答

5

有什么能尽量精简Python的itertools.product(),但你可以使用LINQ,通过Eric Lippert的博客。

0
+1

Zip方法不会给出两个列表之间的所有可能的排列方式。 – Femaref 2011-03-27 23:00:28

+0

Zip在这里不起作用,因为@Yippie想要所有可能的图像配对,除非两个图像相同。 – 2011-03-27 23:02:36

+0

原帖用zip标记了这个,我认为应该是产品。我重新标记了。 – 2011-03-27 23:02:52

0
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); 
} 
+1

我认为原来的代码更好。 – 2011-03-27 23:03:51

+0

我同意。然而,这个问题需要一个电话。我在LINQ中链接到了Eric Lippert的笛卡尔产品,因此我喜欢这个答案,因为这应该是最简单最漂亮的方法。 – Femaref 2011-03-27 23:04:52

0

效率不高:

var permutations = sequence.Images.SelectMany (image1 => sequence.Images.Where (image2 => image1 != image2).Select(image2 => new ImagePair (image1, image2))); 
4

我倾向于将它分解为两个阶段。首先,查询产生对所需的序列,和第二,在序列的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);