检查对象列表是否已存在于另一个对象列表中

时间:2016-03-23 02:23:48

标签: c#

1-我 我从CSV文件加载人员列表并将其存储在列表中 我还从db加载人员列表并将其存储在List

我怎样才能获得他们在csv文件中但不在数据库中的用户?

  

例如:DB有5个用户(A,B,C,D,E),CSV有4个用户(B,E,Q,P)   代码应该返回用户列表(Q,P)

public class Person
{
    public string UserName { get; set; }
    public int Age { get; set; }
}



 public class App
        {
            private IEnumerable<Person> usersDb;
            private IEnumerable<Person> usersCsv;

            public App(int age)
        {
             usersDb = GetUsersFromDb(age);
             usersCsv = GetUsersFromCsv(age);
        }

        public void AddMissingUsers()
        {
            var missingUsers = usersCsv.Where(x => !usersDb.Any(y => x.UserName.Trim().ToUpper().
                Equals(y.UserName.Trim().ToUpper()))); //I tried this one 
            // add to database
        }

    }

其他问题

  

Ps:我使用实体框架6是否有更好的方法来执行我的代码中显示的任务?从数据库获取所有用户的instate然后检查是否存在?

     

另一方面,如果我执行相反操作并检查我的csv文件中的每一行(如果存在于数据库中),这也可以是长操作,因为该文件可以包含许多行。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用Except

 var usersNotInDb = usersCsv.Except(usersDb).ToList();
 context.Users.AddRange(usersNotInDb);
 context.SaveChanges();

答案 1 :(得分:1)

这可以解决你的问题, 按如下方式更改Person类,

public class Person : IEqualityComparer<Person>
    {
        public string UserName { get; set; }
        public int Age { get; set; }

        bool IEqualityComparer<Person>.Equals(Person x, Person y)
        {
            if (x.UserName == y.UserName)
                return true;
            return false;
        }

        int IEqualityComparer<Person>.GetHashCode(Person obj)
        {
            return base.GetHashCode();
        }
    }

然后将您的查询更改为

Person p = new Person();
        var notInDBList = usersCsv.Except(usersDb, p).ToList();