枚举所有组合的最佳方式

时间:2015-07-07 16:15:41

标签: c# .net

假设我有任何顺序的以下列表:

S1 
R1 
R2 
S2
S3

我需要创建一个LIST,其中每个“S”包含每个“R”组合

输出:

S1 => R1
S1 => R2
S2 => R1
S2 => R2
S3 => R1
S3 => R2

实现这一目标的最佳方法是什么? 感谢

4 个答案:

答案 0 :(得分:5)

尝试:

var byPrefix = list.GroupBy(i => i.First()).ToDictionary(g => g.Key, g => g);
var result = 
    from s in byPrefix['S']
    from r in byPrefix['R']
    select new { s, r };

答案 1 :(得分:1)

正如Pranav和huseyin所提到的,你只需要分成两个列表,然后使用嵌套的foreach来遍历它们。

var startingList = new List<string> { "S1", "R1", "R2", "S2", "S3" };
List<Tuple<string, string>> result = new List<Tuple<string, string>>();

foreach(var s in startingList.Where(x => x.StartsWith("S")).ToList())
{
    foreach(var r in startingList.Where(x => x.StartsWith("R")).ToList())
    {
        result.Add(new Tuple<string, string>(s, r));
    }
}

答案 2 :(得分:0)

如果这总是静态的,我的意思是总是两个列表(或前缀),你可以做嵌套循环:

        List<string> list = new List<string>();
        list.Add("S1");
        list.Add("R1");
        list.Add("R2");
        list.Add("S2");
        list.Add("S3");

        foreach (var s in list.Where(l => l.StartsWith("S")))
        {
            foreach (var r in list.Where(l => l.StartsWith("R")))
            {
                Console.WriteLine(string.Format("{0} => {1}", s, r));
            }
        }

或:

        list.Where(l => l.StartsWith("S")).ToList().ForEach(s => list.Where(l => l.StartsWith("R")).ToList().ForEach(r => Console.WriteLine(string.Format("{0} => {1}", s, r))));

您可以将结果添加到另一个列表中,而不是Console.WriteLine。

答案 3 :(得分:0)

这就是我提出的,数组和枚举器的混合:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = new string[] {
                "S1", 
                "R1", 
                "R2", 
                "S2",
                "S3"
            };
            foreach (var item in CombinationsOfSAndR(input)) 
            {
                Console.WriteLine("{0} -> {1}", item.Key, item.Value);
            }
            /* OUT:
            S1 -> R1
            S1 -> R2
            S2 -> R1
            S2 -> R2
            S3 -> R1
            S3 -> R2 */
        }
        static IEnumerable<KeyValuePair<string, string>> CombinationsOfSAndR(string[] input)
        {
            for (int i = 0; i < input.Length; i++)
            {
                if (input[i].StartsWith("S"))
                {
                    for (int j = 0; j < input.Length; j++)
                    {
                        if (input[j].StartsWith("R"))
                        {
                            yield return new KeyValuePair<string, string>(input[i], input[j]);
                        }
                    }
                }
            }
        }
    }
}