【问题标题】:How to delete item from LinkedList by specific compare?如何通过特定比较从 LinkedList 中删除项目?
【发布时间】:2019-12-10 14:07:47
【问题描述】:

我有LinkedListRemove(item) 方法作为参数item

我想知道我必须覆盖什么才能通过特定参数删除项目?

例如我有LinkedList<MyClass>,在MyClass 我有变量 int 索引,我想通过这个值进行比较...

就像,我正在寻找一些 override compare(Obj) 方法,当我从 LinkedList 中删除项目时,我可以覆盖和比较对象我需要的值...

编辑

方法Where 不适合,因为实际上我有一个通用的LinkedList 实现,实际上我的LinkedList 看起来像LinkedList<TYPE>,它可以是任何类型。因此我不能使用where,因为实际上我不知道确切的类型

【问题讨论】:

  • 寻找不相等而不是相等的项目: LinkedList myClass = new LinkedList(); LinkedList 结果 = (LinkedList) myClass.Where(x => x.item != 5);
  • 这能回答你的问题吗? Delete record using linQ with lambda Expression
  • 我不确定,但还不够 var new list = LinkedList.Where(x=>x.index ==1).ToList(); foreach (var item in list) {LinkedList.Remove(item)}
  • 我会创建自己的对象并覆盖删除方法,或者我想您可以尝试扩展方法并使用自己的方法扩展 LinkedList
  • 你可以寻找这个:stackoverflow.com/questions/10454519/…,在你的MyClass上实现IEquatable<MyClass>

标签: c#


【解决方案1】:

最简单的方法是设置一个变量,该变量将检查链接方式中的每个值是否是您要删除的值,并且还设置一个变量,该变量比第一个变量跟踪的值/步长一个值/步。

这样,当主变量(进行检查的变量)发现您要删除的列表值时,您将后面变量的“下一个值”设置为等于主变量的“下一个值”,从而覆盖并删除它。

每次增加主变量时,也增加后面的变量,这样你就可以让它落后一步。

图表(左为之前,右为之后): https://gyazo.com/4d989b6ff6249249c9d63a17a830a8c1

基本上,只需设置两个变量:一个是检查每个链表值以找到您要删除的那个,另一个是在它后面,这样当您找到要删除的值时,您设置将其后面的变量转换为主变量前面的值,从而覆盖已删除的部分。

【讨论】:

    【解决方案2】:
    using System;
    using System.Collections.Generic;
    
    namespace ConsoleAppCore
    {
        public static class Extension
        {
            public static List<dynamic> Where(this IEnumerable<dynamic> list, Func<dynamic, bool> func)
            {
                List<dynamic> result = new List<dynamic>();
                foreach(dynamic item in list) {
                    try {
                        if (func(item))
                            result.Add(item);
                    }
                    catch {
                        continue;
                    }
                }
                return result;
            }
        }
        class YourClass
        {
            public int x = 5;
        }
        class Program
        {
            static void Main(string[] args)
            {
                LinkedList<dynamic> list = new LinkedList<dynamic>();
                list.AddAfter(list.AddAfter(list.AddAfter(list.AddAfter(
                    list.AddAfter(list.AddAfter(list.AddAfter(list.AddFirst(
                        (decimal)1), 2), (double)3), "Hello"), 5), new YourClass()), (float)7), 8);
    
                var newlist = list.Where(i => i == "Hello");
                // only one logical operation at a time (caused exceptions break the logic)
                newlist.AddRange(list.Where(i => i.x == 5));
                newlist.AddRange(list.Where(i => i > 5));
    
                foreach(var i in newlist)
                    Console.WriteLine(i);
            }
        }
    }
    

    输出

    你好,ConsoleAppCore.YourClass,7、8

    【讨论】:

    • 他不在乎value type
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多