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

时间:2009-04-09 01:54:22

标签: c# linq functional-programming

嘿伙计们,我正试着弄清楚LINQ和FP,如果这是天真的话请原谅我。我正在尝试使用LINQ进行一些字符串解析并映射到一个函数,所以我需要将我的字符串拆分成更小的字符串。

我想将数组拆分为两个较小的列表。我可以使用reduce(.Aggregate())来执行此操作吗?我试图找出如何应用reduce来返回列表,但我没有运气。

我想要的是:

myString.ToCharArray().Take(2)

映射到每一个元素。我无法绕过我的脑袋如何减少列表而不将每个元素应用于每一个元素,而不是每一个元素。

具体例子。

  给出(1,2,3,4,5,6)

     

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

澄清:

  

给出“abcdef”

     

我想要“ab”,“cd”,“ef”

为你们提供帮助。

2 个答案:

答案 0 :(得分:6)

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);

答案 1 :(得分:1)

这似乎不是你想要的方法,但这就是我所看到的:

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

注意:我认为如果你有一个奇数个字符,子字符串可能会崩溃;可能需要添加一个检查并使用类似的东西(myString.Length%2 == 0?2:1),但我还没有测试过。

第二个注意:对我来说,这里的难点在于你的Reduce实际上取决于数组索引而不是值;因此我的枚举数组索引和从那里工作的解决方案。另一个解决方案是提供一个方法(我不能想到内置的方法),使用包含索引和字符的元组枚举字符串中的字符。