0

我试图通过用 linq 调用替换项目中的现有代码来精简 linq。在此方法中,我检查行列表中的条件,如果条件为真,则将该元素从行移至已处理行。

数据结构只是列表:

List<LineSegment2> lines;
List<LineSegment2> processedLines;

原始代码是:

for (int i = lines.Count - 1; i >= 0; i--)
{           
   if (lines[i].P2.x < sweepPosition)
   {
      processedLines.Add(lines[i]);
      lines.RemoveAt(i);
   }
}

我的 linq 代码是:

var toMove = lines.FindAll(x => x.P2.x < sweepPosition);
toMove.ForEach(x =>
{
   processedLines.Add(x);
   lines.Remove(x);
});

我的问题是:这个 linq 代码是否效率较低,因为它使用更多内存来创建临时列表“toMove”。有没有办法在不需要临时列表的情况下创建 linq 查询,或者原始代码总是更有效?

4

3 回答 3

1

The "linq" code is less efficient and (more importantly) not necessarily much easier to maintain. Stick with your original code if you must choose between these two alternatives. I'd just recommend you run the for loop forward -- no reason you should run it backwards like you're doing.

As a side note, I wonder if it would be appropriate for your use case to just maintain a single list and add an IsProcessed property to the LineSegment2 class. You might consider that.

于 2012-06-12T07:28:00.750 回答
1

更 LINQy 的解决方案是一次添加所有已处理的行,然后获取剩余的行:

processedLines.AddRange(lines.Where(x => x.P2.x < sweepPosition));
lines = lines.Where(x => x.P2.x >= sweepPosition).ToList();

至于效率,它不会像您的原始代码那么快。这不是您使用 LINQ 的原因。

不过,有一个潜在的优势。它将创建一个新的行列表,因此如果您将很多行移动到已处理列表中,它将删除列表中未使用的项目。

于 2012-06-12T07:06:27.283 回答
0

我不太确定效率......但在Linq我会这样做

processedLines = processedLines.Concat(lines.Where(x => x < sweepPosition)).ToList();
lines.RemoveAll(x => x < sweepPosition);
于 2012-06-12T07:04:50.283 回答