【问题标题】:C# LINQ, need help about logic / algorithmC# LINQ,需要关于逻辑/算法的帮助
【发布时间】:2016-11-29 05:00:08
【问题描述】:

我有一个值列表,如下所示,左侧的数字代表要删除/插入的对象,其中“插入/删除”是采取的措施

1 insert
2 insert
3 insert
2 remove
4 insert
2 insert
3 remove
5 insert
3 insert
5 remove

我想要的最终结果是“5 删除”。

因此,如果列表中已删除对象的位置大于插入时相同对象的位置,则将其删除,其他将保持原样(插入1,2,3,4)。我们可以用 LINQ 来做吗?

【问题讨论】:

  • 所以你希望我们为你实现这个场景,不是吗?很抱歉,我们不提供代码编写服务
  • 不幸的是,我不明白最终结果如何可能是“5 删除”,例如“1 插入”呢?根据您的描述,应该保持原样。这个问题非常令人困惑。而且,这听起来不像是 LINQ 场景。
  • "所以如果移除的对象在列表中的位置大于插入时相同对象的位置,那么它将被移除,其他的将保持原样。" - 什么???
  • 请添加示例数据以及您的第一次努力。也许这会让你明白你想要达到的目标。

标签: c# algorithm linq


【解决方案1】:

假设您的课程 Operation 有两个属性 IDCRUD

public class Operation
{
    public int ID { get; set; }

    public string CRUD { get; set; }
}

var result = list.GroupBy(x => x.ID)
              .ToDictionary(x => x.Key, x => x.Last().CRUD);

//if you want to have same List<Operation>
list = list.GroupBy(x => x.ID)
            .Select(x=> new Operation { ID = x.Key, CRUD = x.Last().CRUD }).ToList();

这里dotNetFiddle

编辑:

public static void Main()
{
    List<Operation> list = new List<Operation>();

    Operation o1 = new Operation();
    o1.ID = 1;
    o1.CRUD = "Insert";
    list.Add(o1);

    Operation o2 = new Operation();
    o2.ID = 2;
    o2.CRUD = "Insert";
    list.Add(o2);

    Operation o3 = new Operation();
    o3.ID = 3;
    o3.CRUD = "Insert";
    list.Add(o3);

    Operation o4 = new Operation();
    o4.ID = 2;
    o4.CRUD = "Remove";
    list.Add(o4);

    Operation o5 = new Operation();
    o5.ID = 4;
    o5.CRUD = "Insert";
    list.Add(o5);

    Operation o6 = new Operation(){ID=2, CRUD = "Insert"};

    list.Add(o6);

    Operation o7= new Operation(){ID=3, CRUD = "Remove"};

    list.Add(o7);

    Operation o8= new Operation(){ID=5, CRUD = "Insert"};

    list.Add(o8);

    Operation o9= new Operation(){ID=3, CRUD = "Insert"};
    list.Add(o9);

    Operation o10= new Operation(){ID=5, CRUD = "Remove"};
    list.Add(o10);

    var result = list.GroupBy(x => x.ID).ToDictionary(x => x.Key, x => x.Last().CRUD);

    foreach(var item in result)
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }

    list = list.GroupBy(x => x.ID)
        .Select(x=> new Operation { ID = x.Key, CRUD = x.Last().CRUD }).ToList();

    Console.WriteLine("List values");

    foreach(var item in list)
    {
        Console.WriteLine(item.ID + ": " + item.CRUD);
    }

    //output for 5 is Remove.

}

public class Operation
{
    public int ID { get; set; }

    public string CRUD { get; set; }
}

【讨论】:

  • 你能把它应用到 OP 的数据上吗?
  • @Enigmativity 是的,你可以应用它。
  • 使用两者。您不能保证 DotNetFiddle 内容与您的答案具有相同的生命周期;该网站可以删除该链接或完全消失。如果您的答案在没有 DotNetFiddle 内容的情况下无法独立存在,那么它就没有用。
  • 人们只是想帮助你写出更高质量的答案。如果您提供额外的信息,那么可以肯定的是,当链接断开时不会丢失太多信息。但是,当有人不同意时,您无需继续争论。
  • 没关系。不好的是用粗体大写文字来争论你的观点,质疑信使的动机。
【解决方案2】:

不确定是否理解问题,但你可以检查最高ID是否等于“删除”,就像这样:

    public class MyList
    {
        public int Id { get; set; }
        public string ToDo { get; set; }
    }

    List<MyList> MyList = new List<MyList>();
    if ( MyList.OrderBy(c => c.Id).LastOrDefault().ToDo == "remove")
        {
            // Code to remove what need to be removed
        }

【讨论】:

  • 你能把它应用到 OP 的数据上吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多