C # foreach вопрос - PullRequest
       4

C # foreach вопрос

1 голос
/ 28 марта 2011

Есть ли C# есть что предложить для следующего кода (в терминах рефакторинга) :

Я хотел бы иметь возможность заменить два вызова 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);
        }
    }
}

Ответы [ 5 ]

5 голосов
/ 28 марта 2011

Нет ничего более лаконичного, чем itertools.product() в Python, но вы можете использовать Linq, как написал Эрик Липперт .

4 голосов
/ 28 марта 2011

Я был бы склонен разбить его на две фазы.Во-первых, запрос для генерации желаемой последовательности пар, а во-вторых, 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);
0 голосов
/ 28 марта 2011

Не эффективно:

var permutations = sequence.Images.SelectMany (image1 => sequence.Images.Where (image2 => image1 != image2).Select(image2 => new ImagePair (image1, image2)));
0 голосов
/ 28 марта 2011
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);
}
0 голосов
/ 28 марта 2011

Существует метод Zip http://msdn.microsoft.com/en-us/library/dd267698.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...