1

これが私の問題です。int[]簡単にするために、具体的なリストを 1 つ示します。

int[] a = {1,2,3,4,5};

このリストの各項目を変換する必要があるとしますが、状況によっては、int または int の配列を返す場合があります。

{v}例として、値がodd{v,v+1}場合と値がevenの場合に返す必要があるとします。私はこれをやった:

int[] b = a.SelectMany(v => v % 2 == 0 ? new int[] { v, v+1 } : new int[] { v })
           .ToArray();

したがって、これを実行すると、期待される応答が得られます。

{1,2,3,3,4,5,5}

数字が繰り返されていることがわかりますよね?35。私はそれらの繰り返し番号を望んでいません。.Distinct()さて、配列を処理した後に呼び出すだけでよいと言うかもしれません。

これが問題です。この句はかなり複雑で (単純な例を作成しただけです)、リストに既に存在する場合SelectManyは絶対に処理したくありません。3

3元のリストに存在するかどうかを確認できました。でも3SelectMany条項に入ってしまったら、二度と手に入れたくありません。たとえば、次のリストがあるとします。

int[] a = {1,2,3,4,5,2};

私はこれを得るでしょう:

{1,2,3,3,4,5,5,2,3}

vしたがって、 (私の元の値)を返しv+1、最後にもう一度。理解しやすいようv+1に、回避したい処理をより適切に表しています。

要約すると、これは私が欲しいものです:

  1. オブジェクトのリストがあります。(小切手)
  2. それらをフィルタリングする必要があり、結果によっては、複数のオブジェクトを返す必要がある場合があります。(チェック、中古SelectMany)
  3. それらを区別する必要がありますが、プロセスの最後ではそれができません。すでに存在する{v}場合にのみ返すことができるはずです。(無知...){v+1}

私が考えたことの 1 つはSelectMany、自分のニーズに合ったカスタムを作成することですが、これを行うための組み込みの方法がないことを確認したいと思います。

編集:私の例で皆さんを誤解させた可能性があると思います。がリストにあるかどうかを調べる方法を知ってv+1います。明確にするために、Id と IdParent の 2 つの int プロパティを持つ 1 つのオブジェクトがあります。すべてのオブジェクトとその親を「返す」必要があります。しかし、オブジェクト自体に由来する ParentId しか持っていません。リストにあるかどうかを知ることができv+1ます。これは、チェックしている ParentId と同じ ID を持つオブジェクトがあるかどうかを確認できるためです。

ANSWER : をAggregate使用することになりました。これは、探していることを正確に実行するために使用できます。

4

4 に答える 4

1

Aggregateこのメソッドを使用するとどうなりますか。元のリストにあったか、(v + 1) を適用した結果であるかに関係なく、既にリストにある番号を処理することはありません。

 int[] v = { 1, 2, 3, 4, 5, 2 };

 var result = v.Aggregate(new List<int>(),
   (acc, next) =>
   {
     if (!acc.Contains(next))
       return (next % 2 == 0) ? acc.Concat(new int[] { next, next + 1 }).ToList()
                              : acc.Concat(new int[] { next }).ToList();
     else
       return acc;
   }).ToArray();
于 2013-10-11T15:15:24.693 に答える
0
var existing = new HashSet<int>(a);

var result = existing
    .Where(v => v % 2 == 0 && !existing.Contains(v + 1))
    .Select(v => v + 1)
    .Concat(existing)
    .ToArray();
于 2013-10-11T14:28:12.127 に答える