列表重编号重复C#

时间:2018-11-30 11:39:10

标签: c#

我确定不是第一个发生这种情况的人,但是我还是从多个角度尝试解决此问题,并且我遇到了同样的问题

我正在从数据库中检索项目,我只希望每个位置的最后一个项目。

class Item {
  public bool is_scheduled {get;set;}
  public int round{get;set;}
  public int round_position {get;set;}

  [NotMapped]
  public int position {get;set;}
  public int ItemsRequired{get;set;}
}

如果ItemsRequired大于1,那么我需要将同一项目的副本添加到列表中。

在ive创建副本之后,我然后尝试重新编号该项目,看来工作正常。

当我整体检查列表时,虽然有重复的数字。

using (var context = new DBContext)
{
    var items = context.Items
   .Where(o => o.round == round && o.is_scheduled == false)
   .GroupBy(o => o.round_position)
   .ToList()
   .Select(GetLastItem)
   .ToList();

    foreach (var item in items)
    {
        Trace.WriteLine($"{item.position}");
    }
    return ParseItems(items);
}


private static List<Item> ParseItems(List<Item> items)
{
    var result = new List<Item>();

    var idx = 0;
    foreach (var item in items)
    {
        var carries = item.ItemsRequired.GetValueOrDefault();

        if (carries == 1)
        {
            idx = idx + 1;
            item.position = idx;
            Trace.WriteLine($"pos:{item.position}");
            result.Add(item);
        }
        else
        {
            for (var i = 0; i < carries; i++)
            {
                idx = idx + 1;
                item.position = idx;
                Trace.WriteLine($"pos:{item.position}");

                result.Add(item);

            }
        }
    }
    foreach (var r in result)
        Trace.WriteLine(r.position);
    return result;
}

private static Item GetLastItem(IGrouping<int?, Item> arg)
{
    var items = arg
        .OrderBy(o => o.date_created)
        .ToList();

    var last = items.Last();
    return last;
}

所以,如果我要拿走物品并指定一个位置,那么

items = items.Select((item,idx)=>{
var clone = item;
clone.position=idx;
return clone;}).ToList();

// Print items
foreach(var item in items)
Trace.WriteLine(item.position);

当前在输出窗口中显示数字的重复项。

4 个答案:

答案 0 :(得分:1)

内部的for循环实际上将一次又一次地更新同一项目,因为它是引用类型。相反,您将需要在Item上创建一个新实例。

...
else
{
    for (var i = 0; i<carries; i++)
    {
        idx = idx + 1;
        var itemClone = new Item();
        itemClone.position = idx
        itemClone.is_scheduled = item.is_scheduled;
        //...set other itemClone property values

        Trace.WriteLine($"pos:{itemClone.position}");

        result.Add(itemClone);

    }
}
...

答案 1 :(得分:0)

一个组创建一个二维数组。长项(键)是组,短项是长数组中的每个项。因此,您需要使用select枚举键,并获取每个键的最后一项。尝试以下操作:

using(var context = new DBContext){
  .Where(o => o.round == round && o.is_scheduled == false)
  .GroupBy(o=>o.round_position)
  .Select(x => x.LastOrDefault())                    
  .ToList();

}

答案 2 :(得分:0)

i1 = -2:0;
i2 = 0:pi/2;
i3 = pi/2:pi;
f1 = sinh(i1)+2;
f2 = sin(i2)-2;
f3= 2*i3.^2-2*pi*i3+3;
plot([i1 i2 i3],[f1,f2,f3]);

答案 3 :(得分:0)

我自己找到了答案,但是我真的可以使用帮助来了解原因。

如果我服用

{
  "plugins": ["transform-regenerator"]
}