同步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改为任何类型。
谢谢
所以首先我们需要一种比较这些对象的有效方法。由于默认的Equals
和GetHashCode
实现在您的上下文中不会有用,您要么需要覆盖它们,要么创建一个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