エンティティの順序付きリストがあります。各エンティティにはint UniqueKey
プロパティがあります。
リストを変換して、UniqueKey
値を一意にする必要があります (重複があると仮定します)。これは、重複を見つけて徐々に増やしていくことによって行われます。
段階的なプロセス:
- インデックス 1 から開始します(ゼロベースのインデックスを使用しています)
- 以前の要素に同じ
UniqueId
値がある場合は、現在のインデックスで値を増やします。 - 前の要素が同じ UniqueId を持たなくなるまで (2) を繰り返します
- 要素を 1 つ右に移動
たとえば{ 1, 1, 1, 3, 3, 8 }
、次の手順を実行します。
{ 1, 2, 1, 3, 3, 8 }
: インデックス 1 インクリメント{ 1, 2, 2, 3, 3, 8 }
: インデックス 2 がインクリメントされます{ 1, 2, 3, 3, 3, 8 }
: インデックス 2 が再度インクリメントされました{ 1, 2, 3, 4, 3, 8 }
: インデックス 3 インクリメント{ 1, 2, 3, 4, 4, 8 }
: インデックス 4 インクリメント{ 1, 2, 3, 4, 5, 8 }
: インデックス 4 が再度インクリメントされました
以下のコードは、上記のアルゴリズムを非常に手続き的な方法で実行します。
entities = entities.OrderBy(x => x.UniqueId);
foreach (var entity in entities)
{
var leftList = entities.Take(entities.IndexOf(entity));
while (leftList.Any(x => x.UniqueId == entity.UniqueId))
{
entity.UniqueId++;
}
}
質問: これを LINQ に実装することは可能ですか?