題目很簡單
例如有2個集合
List<string> listA = new List<string> { "a", "b", "c", "d", "e" };
List<string> listB = new List<string> { "a", "b", "f" };
需要找出在listA中存在,在listB中不存在的元素。
實現方式一:
List<string> b = new List<string>();
foreach (var item in listA)
{
if (!listB.Contains(item))
b.Add(item);
}
實現方式二
IEnumerable<string> result = listA.Except<string>(listA.Intersect<string>(listB));
方式二的實現是借用了HashSet等價與
ISet<string> setA = new HashSet<string>(listA);
ISet<string> setB = new HashSet<string>(listB);
setA.ExceptWith(setB);
實現方式三:如果listA,listB 都是有序,可以用更簡單的方式來處理
[csharp]
static List<T> ExceptWith<T>(List<T> from, List<T> except) where T : IComparable
{
List<T> resut = new List<T>();
int fromindex, exceptindex, copyindex;
fromindex = exceptindex = copyindex = 0;
while ((fromindex < from.Count) && (exceptindex < except.Count))
{
int compar = ((IComparable)from[fromindex]).CompareTo(except[exceptindex]);
if (compar < 0)
{
fromindex++;
}
else if (compar > 0)
{
exceptindex++;
}
else if (compar == 0)
{
if (fromindex > copyindex)
CopyData(from, resut, copyindex, fromindex);
fromindex++;
copyindex = fromindex;
}
}
CopyData(from, resut, copyindex, from.Count);
return resut;
}
static void CopyData<T>(List<T> from, List<T> to, int startindex, int endindex)
{
if (from == null || to == null || startindex < 0 || endindex < 0 || endindex <= startindex) return;
to.AddRange(from.Where((data, index) => index >= startindex && index < endindex));
}
調用方式: List<string> temp = ExceptWith<string>(new List<string>() { "a", "b", "c", "d", "e" }, new List<string>() { "a", "b", "f" });
List<int> a = ExceptWith<int>(new List<int>() { 1, 3, 4, 7, 9, 11 }, new List<int>() { 4, 7 });
摘自 dz45693的專欄