【问题标题】:Create pairs from List values从列表值创建对
【发布时间】:2017-10-30 01:26:03
【问题描述】:

我有一个包含一些值的列表,比如说 1 2 3 4 5 6

我需要像这样配对它们: 12 13 14 15 16 23 24 25 26 34 35 36 45 46 56

基本上,我需要将它们全部混合以创建独特的值集。

您对如何创建这样的新列表有任何想法吗?

感谢您的意见!

【问题讨论】:

  • 21、31、32、41、42 和 43 怎么样?
  • 看起来 OP 只想要组合,在这种情况下有 C(6,2) = 15 个。 C# 有内置的东西吗?这在 Python 和其他具有列表理解的语言中是微不足道的,所以我想 C# 也是如此......
  • 看起来像是来自 n 的 k 个元素的组合,即 k = 2, n = 6 stackoverflow.com/questions/127704/…
  • 值不是数字。在我的情况下,值可能是字符串。此外,6 不是限制 - 它可能会有所不同。我只是简化了一点。

标签: c# .net list


【解决方案1】:

使用 Linq 和元组:

var arr = new[] { 1, 2, 3, 4, 5, 6 };

arr.SelectMany((fst, i) => arr.Skip(i + 1).Select(snd => (fst, snd)));

【讨论】:

    【解决方案2】:

    如果你喜欢 Linq:

    var ar = new int[] {1, 2, 3, 4, 5};
    
    var combo = (from left in ar
                from right in ar where right > left 
                select new { left, right }).ToArray();
    

    【讨论】:

    • 使用 LINQ 做得很好。我不明白为什么这里有这么多其他答案都使用for/foreach 循环——它们更难理解。 LINQ 更加清晰且易于维护。 +1
    • 也许人们觉得最好提供一个可以改进为更多 .NET 版本的解决方案(因为 LINQ 是最近添加的),或者可以更容易地转换为其他语言?
    【解决方案3】:

    对于您样本中的数据,您可以使用一对简单的嵌套循环来完成:

    var list = new List<int>{1,2,3,4,5,6};
    var res = new List<int>();
    for (int i = 0 ; i != list.Count ; i++) {
        for (int j = i+1 ; j != list.Count ; j++) {
            res.Add(list[i]*10+list[j]);
        }
    }
    

    对于更复杂的数据,您可以使用字符串连接技巧:

    var list = new List<int>{98,76,54,32,10};
    var res = new List<int>();
    for (int i = 0 ; i != list.Count ; i++) {
        for (int j = i+1 ; j != list.Count ; j++) {
            res.Add(int.Parse(string.Format("{0}{1}", list[i], list[j])));
        }
    }
    

    【讨论】:

      【解决方案4】:
      var newList = new List<int>();
      foreach(var i in originalList)
          for(int j = i + 1; j < originalList.Count; ++j)
              newList.Add(originalList[i] * 10 + originalList[j]);
      

      应该帮助...

      【讨论】:

        猜你喜欢
        • 2020-03-01
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        • 2013-08-27
        相关资源
        最近更新 更多