2


0

LINQ(Functional Programming)を使用して、リストを2つのリストに縮小

こんにちは、LINQとFPに興味を抱かせようとしているので、これが素朴な場合はご容赦ください。 LINQを使用して文字列を解析し、関数にマッピングしようとしているので、文字列を小さな文字列に分割する必要があります。

配列を2つの小さなリストに分割したい。 これを行うためにreduce(.Aggregate())を使用できますか? リストを返すためにreduceを適用する方法を考え出そうとしていましたが、運が悪かったのです。

私が欲しいのは:

myString.ToCharArray().Take(2)

1秒おきに要素にマッピングされています。1秒ごとではなく、すべての要素にテイクを適用せずにリストを縮小する方法を頭の中で回避することはできません。

具体例

_ _ 与えられた(1、2、3、4、5、6)

欲しい((1、2)、(3,4)、(5、6)) _ _

明確にするために:

_ _ 与えられた「abcdef」

「ab」、「cd」、「ef」が欲しい _ _

皆さんの助けを応援します。

2 Answer


6


Enumerable.Range(0, myString.Length)
      .GroupBy(index => index / 2, index => myString[index])
      .Select(eachGroup => new string(eachGroup.ToArray()));

上記の例は、インデックスベースのコレクションへのアクセス権があるという事実に基づいています。 この制限なしですべての `+ IEnumerable +`で動作させるには:

collection.Select((e,i) => new { Index = i, Element = e })
      .GroupBy(x => x.Index / 2, x => x.Element);


1


これはあなたが探しているアプローチのようには見えませんが、それは私が見ているものです:

Enumerable.Range(0、myString.Length  -  1).Where(i => i%2 == 0)。選択(i => myString.Substring(i、2).ToCharArray());

注:奇数の文字があると部分文字列がおそらくクラッシュすると思います。おそらくチェックを追加して、(myString.Length%2 == 0?のようなものを使用する必要があります。 2:1)、しかし私はテストしていません。

2番目の注意:私にとってここでの難点は、Reduceが実際には値ではなく配列インデックスに依存していることです。したがって、配列インデックスを列挙してそこから処理するという私の解決策。 もう1つの解決策は、インデックスと文字を含むタプルを使用して文字列内の文字を列挙するメソッド(組み込みのものとは思えない)を提供することです。