添加索引到集合

时间:2011-03-14 21:21:57

标签: c# linq

我在List集合中有一个对象MyObjects列表。

对象模型类似于:

public class MyModel
{
  int prop1 {get;set;}
  int propn {get;set;}
  int TheIndex {get;set;}
}

我完成了几个linq-to-objects查询,最终结束了 var TheOutputSoFar = ....

TheOutputSoFar包含MyModel列表,但集合中的每个项目都具有TheIndex = 0.我正在寻找一种方法,使集合中每个项目的TheIndex增量为1。这就是我尝试过的但它不起作用:

var OutputDailyAppointments1 = from a in TheOutputSoFar
.Select(a => a).AsEnumerable().Select((a, i) =>
new ViewDailyAppointmentsModel{TheIndex = i};

有什么建议吗? 感谢。

3 个答案:

答案 0 :(得分:2)

不要使用Linq:

int index = 0;
foreach (var model in TheOutputSoFar)
    model.TheIndex = index++;

答案 1 :(得分:0)

制作TheIndex属性public

public class MyModel
{
  int prop1 {get;set;}
  int propn {get;set;}
  public int TheIndex {get;set;}
}

var outputDailyAppointments1 = TheOutputSoFar.Select((a, i) =>
    new ViewDailyAppointmentsModel{TheIndex = i});

但我不确定你为什么要使用TheOutputSoFar来创建索引,你可以做到

var outputDailyAppointments1 = Enumerable.Range(0, TheOutputSoFar.Count())
    .Select( i => new ViewDailyAppointmentsModel{TheIndex = i});

答案 2 :(得分:0)

您应该注意如何构建代码。 LINQ应该用于建模查询,而不是用来改变对象。

您的代码(已发布)存在许多潜在问题。例如,Select((a,i) => new ViewDailyAppointmentsModel{...}的结果是查询。它实际上并没有改变你的集合......每次评估时它都会产生一个新的模型对象集合。原始集合不会反映任何更改。 这实际上是你的意图吗?

如果TheIndex属性是暂时的,并且仅在处理集合时需要,请考虑将其移出到作为查询的一部分构造的匿名类型中:

public class MyModel
{  
    int prop1 {get;set;}  
    int propn {get;set;}
}

var OutputDailyAppointments1 = TheOutputSoFar
   .Select((a, i) => new {Item = a, TheIndex = i}; // anonymous object captures index

另一方面,如果你真的想要更新你的对象集,这样每个对象都会在列表中捕获它的最终位置,那么只需使用一个循环(不要为此使用LINQ ..):

int position = 0;
foreach( var item in TheOutpuSoFar )
{
    item.TheIndex = position++;
}

您还应该考虑将项目索引直接合并到其属性集中的设计选择是否是您想要的。通常很难在这样的模型中保持一致性,并且很容易得到一个集合,其中Index属性没有正确反映其意图。这里有许多潜在的陷阱 - 例如,如果您使用OrderBy之类的方法重新排序此类项目,则会产生混淆。