使用linq比较2个列表

时间:2010-07-19 08:13:56

标签: linq generics

我是一个linq noob ....有人可以请一些我如何使用linq实现这一点...我试图在两个方向比较2个列表...

    internal void UpdateUserTeams(int iUserID)
    {
        UserTeamCollection CurrentTeams = GetUserTeams(iUserID);
        UserTeamCollection UpdatedTeams = this;

        foreach (UserTeam ut in CurrentTeams)
        {
            if(!UpdatedTeams.ContainsTeam(ut.ID))
            {
                RemoveTeamFromDB();
            }
        }

        foreach (UserTeam ut in UpdatedTeams)
        {
            if (!CurrentTeams.ContainsTeam(ut.ID))
            {
                AddTeamToDB();
            }
        }

    }


    public bool ContainsTeam(int iTeamID)
    {
        return  this.Any(t => t.ID == iTeamID);
    }

5 个答案:

答案 0 :(得分:2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    

namespace Linqage
{
    class Program
    {
        static void Main(string[] args)
        {
            UserTeamCollection currentTeams = new UserTeamCollection() 
            {
                new UserTeam(1),
                new UserTeam(2),
                new UserTeam(3),
                new UserTeam(4),
                new UserTeam(5)
            };

            UserTeamCollection updatedTeams = new UserTeamCollection()
            {
                new UserTeam(2),
                new UserTeam(4),
                new UserTeam(6),
                new UserTeam(8)                
            };

            currentTeams.Except(updatedTeams).All(u =>
            {
                //Console.WriteLine("Item ID: {0}",u.ID);
                //RemoveFromDB()
                return true;
            });

            updatedTeams.Except(currentTeams).All(u =>
            {
                //Console.WriteLine("Item ID: {0}", u.ID);
                //AddToDB()
                return true;
            });            
        }
    }

    public class UserTeamCollection
       : List<UserTeam>
    {

    }

    //Either overwrite the GetHashCode and Equals method OR create a IComparer
    public class UserTeam
    {
        public int ID { get; set; }

        public UserTeam(int id)
        {
            ID = id;
        }
        public override bool Equals(object obj)
        {
            UserTeam iOther = obj as UserTeam;
            if (iOther != null)
            {
                return this.ID == iOther.ID;
            }
            return false;
        }
        public override int GetHashCode()
        {
            return ID.GetHashCode();
        }
    }

}

答案 1 :(得分:0)

您通常会使用Enumerable.Except两种方式来获取差异。然后根据需要添加和删除。

答案 2 :(得分:0)

var addedTeams = UpdatedTeams.Except(CurrentTeams);
var removedTeams = CurrentTeams.Except(UpdatedTeams);

答案 3 :(得分:0)

您正试图从完整的外部连接中获取外部部件。这是实现这一目标的一种粗略方式。

ILookup<int, UserTeam> currentLookup = CurrentTeams
  .ToLookup(ut => ut.ID);
ILookup<int, UserTeam> updatedLookup = UpdatedTeams
  .ToLookup(ut => ut.ID);

List<int> teamIds = CurrentTeams.Select(ut => ut.ID)
  .Concat(UpdatedTeams.Select(ut => ut.ID))
  .Distinct()
  .ToList();

ILookup<string, UserTeam> results =
(
  from id in teamIds
  let inCurrent = currentLookup[id].Any()
  let inUpdated = updatedLookup[id].Any()
  let key = inCurrent && inUpdated ? "No Change" :
    inCurrent ? "Remove" :
    inUpdated ? "Add" :
    "Inconceivable"
  let teams = key == "Remove" ? currentLookup[id] :
    updatedLookup[id]
  from team in teams
  select new {Key = key, Team = team)
).ToLookup(x => x.Key, x => x.Team);

foreach(UserTeam ut in results["Remove"])
{
  RemoveTeamFromDB();
}
foreach(UserTeam ut in results["Add"])
{
  AddTeamToDB();
}

答案 4 :(得分:0)

所以将您的初始问题转换为英语要求:

    foreach (UserTeam ut in CurrentTeams)           // for each current team
    {
        if(!UpdatedTeams.ContainsTeam(ut.ID))       // that is not in the updated teams list
        {
            RemoveTeamFromDB();         // remove it from the database
        }
    }

    foreach (UserTeam ut in UpdatedTeams)       //for each of the teams in the updated teams list
    {
        if (!CurrentTeams.ContainsTeam(ut.ID))  //if the current team does not contain the updated team
        {
            AddTeamToDB();              //add the team to the database
        }
    }

因此,您想要:

//select all current teams that are not in updated teams list
CurrentTeam.Except(UpdatedTeams).All(team => { RemoveTeamFromDB(team); return true; });

//select all updated teams that are not in the current teams list
UpdatedTeam.Except(CurrentTeams).All(team => { AddTeamToDB(team); return true; });

确保您的UserTeam对象对Equals和GetHashCode方法有适当的覆盖,以便两个UserTeams之间的比较准确:)