同步2个列表

本文关键字:列表 2个 同步 | 更新日期: 2023-09-27 18:11:27

同步列表的最佳最快方法是什么?

public class UserGroup
    {
        public UserGroup(string group, string user)
        {
            this.Group = group;
            this.User = user;
        }
        public string Group { get; set; }
        public string User { get; set; }
    }

IList<UserGroup> userGroup1 = new IList<UserGroup>();
IList<UserGroup> userGroup2 = new IList<UserGroup>();

每个组有不同数量的成员。我怎样才能找出不同的并将它们合并到一个新列表中?

PS:如果效率更高的话,我可以把类型从IList改为任何类型。

谢谢

同步2个列表

所以首先我们需要一种比较这些对象的有效方法。由于默认的EqualsGetHashCode实现在您的上下文中不会有用,您要么需要覆盖它们,要么创建一个IEqualityComparer。我选择了后者,如果你愿意,也可以选择前者。这里有一个简单的比较器:

public class UserGroupComparer : IEqualityComparer<UserGroup>
{
    public bool Equals(UserGroup x, UserGroup y)
    {
        return x.Group == y.Group && x.User == y.User;
    }
    public int GetHashCode(UserGroup obj)
    {
        return 37 * obj.Group.GetHashCode() + 19 * obj.User.GetHashCode();
    }
}

现在您有了这个比较器,您可以利用LINQ为您完成工作:

var combinedList = userGroup1.Union(userGroup2, new UserGroupComparer())
    .ToList();

这将包含列表中所有的用户组,但没有任何重复的。

您可以尝试:

userGroup1.Concat(userGroup2).Distinct();

别忘了为UserGroup类重写Equals和GetHashCode

如果集合中的项属于两种不同的类型,则可以使用以下命令:

 class CollectionSynchronizer<TSource, TDestination>
    {
        public Func<TSource, TDestination, bool> CompareFunc { get; set; }
        public Action<TDestination> RemoveAction { get; set; }
        public Action<TSource> AddAction { get; set; }
        public Action<TSource, TDestination> UpdateAction { get; set; }
        public void Synchronizer(ICollection<TSource> sourceItems, ICollection<TDestination> destinationItems)
        {
            // Remove items not in source from destination
            RemoveItems(sourceItems, destinationItems);
            // Add items in source to destination 
            AddOrUpdateItems(sourceItems, destinationItems);
        }
        private void RemoveItems(ICollection<TSource> sourceCollection, ICollection<TDestination> destinationCollection)
        {
            foreach (var destinationItem in destinationCollection.ToArray())
            {
                var sourceItem = sourceCollection.FirstOrDefault(item => CompareFunc(item, destinationItem));
                if (sourceItem == null)
                {
                    RemoveAction(destinationItem);
                }
            }
        }
        private void AddOrUpdateItems(ICollection<TSource> sourceCollection, ICollection<TDestination> destinationCollection)
        {
            var destinationList = destinationCollection.ToList();
            foreach (var sourceItem in sourceCollection)
            {
                var destinationItem = destinationList.FirstOrDefault(item => CompareFunc(sourceItem, item));
                if (destinationItem == null)
                {
                    AddAction(sourceItem);
                }
                else
                {
                    UpdateAction(sourceItem, destinationItem);
                }
            }
        }
    }

的用法如下:

var collectionSynchronizer = new CollectionSynchronizer<string, ContentImageEntity>
            {
                CompareFunc = (communityImage, contentImage) => communityImage == contentImage.Name,
                AddAction = sourceItem =>
                {
                    var contentEntityImage = _contentImageProvider.Create(sourceItem);
                    contentEntityImages.Add(contentEntityImage);
                },
                UpdateAction = (communityImage, contentImage) =>
                {
                    _contentImageProvider.Update(contentImage);
                },
                RemoveAction = contentImage =>
                {
                    contentEntityImages.Remove(contentImage);
                }
            };
            collectionSynchronizer.Synchronizer(externalContentImages, contentEntityImages);

查看这个问题的答案:使用linq

从两个对象列表创建一个列表

基本上可以在System.Linq中使用:

userGroup1.Union(userGroup2).ToList();

您可以使用HashSet参见下面的链接类http://msdn.microsoft.com/en-us/library/bb383091.aspx