C#foreach问题

时间:2011-03-27 22:55:26

标签: c# foreach

C#是否可以为以下代码提供(在重构术语中)

我希望能够使用for every (x, x) possible pair这样的一个电话来替换两个foreach电话,这可以完成吗?

foreach (var image1 in sequence.Images)
{
    foreach (var image2 in sequence.Images)
    {
        if (image1 != image2)
        {
            metric.SetImageMetric(new ImagePair(image1, image2), 1.0);
        }
    }
}

5 个答案:

答案 0 :(得分:5)

没有什么比Python的itertools.product()简洁,但您可以使用Linq,由Eric Lippert撰写博客。

答案 1 :(得分: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);

答案 2 :(得分:0)

答案 3 :(得分: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);
}

答案 4 :(得分:0)

效率不高:

var permutations = sequence.Images.SelectMany (image1 => sequence.Images.Where (image2 => image1 != image2).Select(image2 => new ImagePair (image1, image2)));
相关问题