代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

如何在C语言中获得字符串列表中的无序选二排列#

c#
  •  1
  • Thorin Oakenshield  · 技术社区  · 14 年前

    我有一个字符串列表

       List< String> lst
    
     A
     B
     C
    

    我需要将每个项目与其他项目的组合添加到列表中,如

     A
     B
     C
     A-B
     A-C
     B-C
    

    现在我使用嵌套for循环。

    提前谢谢

    4 回复  |  直到 14 年前
        1
  •  7
  •   maciejkow    14 年前
    var sourceStrings = new List<string> {"A", "B", "C"};
    
    var resultStrings = from a in sourceStrings
                        from b in sourceStrings
                        where a != b
                        select a + "-" + b;
    
    foreach (var result in resultStrings)
        Console.WriteLine(result);
    
        2
  •  6
  •   Thomas Levesque    14 年前

    除了之前的答案,你可能对 this article

        3
  •  4
  •   Oliver    14 年前

    为了完整起见,这里用流利的文字陈述:

    var sourceStrings = new List<string> { "A", "B", "C" };
    
    var resultStrings = sourceStrings.SelectMany(a => sourceStrings,
                                                 (a, b) => new { a, b })
                                     .Where(n => n.a != n.b)
                                     .Select(n => n.a + "-" + n.b);
    
    foreach (var result in resultStrings)
        Console.WriteLine(result);
    
        4
  •  4
  •   Eric Lippert    14 年前

    正如我在评论中提到的,我认为你想要的是 置换 (对有序集重新排序)或 结合 (得到无序集合的无序子集)

    在C#中完成所有这些工作的通用库可以在以下位置找到:

    http://www.codeproject.com/KB/recipes/Combinatorics.aspx

    我还不完全清楚你想要什么。以下是一些选项:

    设为集合{A,B,C}

    笛卡尔积S x S是AA,AB,AC,BA,BB,BC,CA,CB,CC。这是两个元素的所有可能的组合,顺序很重要,包括重复。

    “S选择2”是AB,AC,BC。也就是说,两个元素的所有可能组合,没有顺序,没有重复。

    您可以通过二进制计数生成一个幂集(如果您想这样做的话)。考虑二进制中的数字0到7:

    ABC
    000  0  nothing
    001  1  C
    010  2  B 
    011  3  BC
    100  4  A   
    101  5  AC
    110  6  AB
    111  7  ABC
    

    你到底想要什么?