代码之家  ›  专栏  ›  技术社区  ›  Spence

使用LINQ(函数式编程)将列表缩小为两个较小的列表。

  •  2
  • Spence  · 技术社区  · 17 年前

    嘿,伙计们,我正努力让我的头绕过林肯和法警,所以如果这是幼稚的原谅我。我正在尝试使用LINQ进行一些字符串解析,并将其映射到一个函数上,因此我需要将字符串拆分为更小的字符串。

    我想把数组分成两个较小的列表。我可以使用reduce(.aggregate())来执行此操作吗?我正努力想办法用减量法返回一个列表,但我运气不好。

    我想要的是:

    myString.ToCharArray().Take(2)
    

    映射到每一个第二个元素上。我无法在脑海中思考如何在不将take应用到每一个元素(而不是每一个第二个元素)的情况下减少列表。

    具体例子。

    给定(1、2、3、4、5、6)

    我想要((1,2),(3,4),(5,6))

    澄清:

    给定“ABCDEF”

    我要“ab”、“cd”、“ef”

    为你们的帮助干杯。

    2 回复  |  直到 17 年前
        1
  •  6
  •   Mehrdad Afshari    17 年前
    Enumerable.Range(0, myString.Length)
          .GroupBy(index => index / 2, index => myString[index])
          .Select(eachGroup => new string(eachGroup.ToArray()));
    

    请注意,上面的示例依赖于这样一个事实:您对集合具有基于索引的访问权。使它在每一个 IEnumerable<T> 无此限制:

    collection.Select((e,i) => new { Index = i, Element = e })
          .GroupBy(x => x.Index / 2, x => x.Element);
    
        2
  •  1
  •   Chris Shaffer    17 年前

    这看起来不像你想要的方法,但我看到的是:

    Enumerable.Range(0, myString.Length - 1)
        .Where(i => i % 2 == 0)
        .Select(i => myString.Substring(i, 2).ToCharArray());
    

    注意:如果您有奇数个字符,子字符串可能会崩溃;可能需要添加一个检查,并使用(mystring.length%2==0?2:1),但我还没有测试。

    第二个注意事项:对我来说,这里的困难在于减少实际上取决于数组索引而不是值;因此,我的解决方案是枚举数组索引并从中进行工作。另一种解决方案是提供一种方法(我想不出内置的方法),该方法使用包含索引和字符的元组枚举字符串中的字符。