【发布时间】:2013-11-27 14:54:36
【问题描述】:
我有一个有序的实体列表。每个实体都有一个int UniqueKey 属性。
我希望列表经过转换,从而使 UniqueKey 值唯一(假设有重复)。这是通过查找重复项并逐步增加它们来完成的。
分步流程:
- 从索引 1 开始 (我使用从零开始的索引)
- 如果任何先前的元素具有相同的
UniqueId值,则增加当前索引处的值。 - 重复 (2) 直到前面的元素都没有相同的 UniqueId
- 向右移动一个元素
例如,{ 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 中实现此功能?
【问题讨论】:
-
为什么要在 LINQ 中实现这个?我认为你的算法在目前的情况下很清楚。您绝对可以加快它的速度(这会降低可读性),但使用 LINQ 更有可能使该算法变得更慢且可读性降低。 LINQ 不应该是你的金锤......
-
您是否必须使用这种精确的算法,或者您是否可以使用任何算法来使所有 ID 都变得唯一?如果想使用 LINQ,有更好的方法为每个项目分配一个唯一的 ID。
-
您 shouldn't 将 LINQ 用于具有非查询语义的任务。只需使用命令式代码,它会更加清晰和简单。
-
为什么要完成所有这些工作?为什么不把 {1, 1, 1, 2} 变成 {1, 2, 3, 4} 呢?
标签: c# .net algorithm linq functional-programming