how to check if object already exists in a list

前端 未结 9 1726
梦谈多话
梦谈多话 2020-11-28 05:41

I have a list

  List myList

and I am adding items to a list and I want to check if that object is already in the list.

相关标签:
9条回答
  • 2020-11-28 05:45

    Here is a quick console app to depict the concept of how to solve your issue.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication3
    {
        public class myobj
        {
            private string a = string.Empty;
            private string b = string.Empty;
    
            public myobj(string a, string b)
            {
                this.a = a;
                this.b = b;
            }
    
            public string A
            {
                get
                {
                    return a;
                }
            }
    
            public string B
            {
                get
                {
                    return b;
                }
            }
        }
    
    
        class Program
        {
            static void Main(string[] args)
            {
                List<myobj> list = new List<myobj>();
                myobj[] objects = { new myobj("a", "b"), new myobj("c", "d"), new myobj("a", "b") };
    
    
                for (int i = 0; i < objects.Length; i++)
                {
                    if (!list.Exists((delegate(myobj x) { return (string.Equals(x.A, objects[i].A) && string.Equals(x.B, objects[i].B)) ? true : false; })))
                    {
                        list.Add(objects[i]);
                    }
                }
            }
        }
    }
    

    Enjoy!

    0 讨论(0)
  • 2020-11-28 05:49

    If you use EF core add

     .UseSerialColumn();
    

    Example

    modelBuilder.Entity<JobItem>(entity =>
            {
                entity.ToTable("jobs");
    
                entity.Property(e => e.Id)
                    .HasColumnName("id")
                    .UseSerialColumn();
    });
    
    0 讨论(0)
  • 2020-11-28 05:51

    Are you sure you need a list in this case? If you are populating the list with many items, performance will suffer with myList.Contains or myList.Any; the run-time will be quadratic. You might want to consider using a better data structure. For example,

     public class MyClass
        {
            public string Property1 { get; set; }
            public string Property2 { get; set; }
    
        }
    
        public class MyClassComparer : EqualityComparer<MyClass>
        {
            public override bool Equals(MyClass x, MyClass y)
            {
                if(x == null || y == null)
                   return x == y;
    
                return x.Property1 == y.Property1 && x.Property2 == y.Property2;
            }
    
            public override int GetHashCode(MyClass obj)
            {
                return obj == null ? 0 : (obj.Property1.GetHashCode() ^ obj.Property2.GetHashCode());
            }
        }
    

    You could use a HashSet in the following manner:

      var set = new HashSet<MyClass>(new MyClassComparer());
      foreach(var myClass in ...)
         set.Add(myClass);
    

    Of course, if this definition of equality for MyClass is 'universal', you needn't write an IEqualityComparer implementation; you could just override GetHashCode and Equals in the class itself.

    0 讨论(0)
  • 2020-11-28 05:52

    Edit: I had first said:


    What's inelegant about the dictionary solution. It seems perfectly elegant to me, esp since you only need to set the comparator in creation of the dictionary.


    Of course though, it is inelegant to use something as a key when it's also the value.

    Therefore I would use a HashSet. If later operations required indexing, I'd create a list from it when the Adding was done, otherwise, just use the hashset.

    0 讨论(0)
  • 2020-11-28 05:53

    Another point to mention is that you should ensure that your equality function is as you expect. You should override the equals method to set up what properties of your object have to match for two instances to be considered equal.

    Then you can just do mylist.contains(item)

    0 讨论(0)
  • 2020-11-28 06:00

    If it's maintainable to use those 2 properties, you could:

    bool alreadyExists = myList.Any(x=> x.Foo=="ooo" && x.Bar == "bat");
    
    0 讨论(0)
提交回复
热议问题