2011-03-27 72 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);