Tôi viết phương pháp nhanh hơn để có thể đặt phương thức nhỏ. Nhưng tôi thử nghiệm nó trong một số dữ liệu mà một số thời gian đó là nhanh hơn mà Intersect nhưng một số thời gian Intersect nhanh rằng mã của tôi.
public static bool Contain<T>(List<T> a, List<T> b)
{
if (a.Count <= 10 && b.Count <= 10)
{
return a.Any(b.Contains);
}
if (a.Count > b.Count)
{
return Contain((IEnumerable<T>) b, (IEnumerable<T>) a);
}
return Contain((IEnumerable<T>) a, (IEnumerable<T>) b);
}
public static bool Contain<T>(IEnumerable<T> a, IEnumerable<T> b)
{
HashSet<T> j = new HashSet<T>(a);
return b.Any(j.Contains);
}
Gọi Intersect Set
chưa kiểm tra kích thước thứ hai và đây là mã của Intersect.
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in second) set.Add(element);
foreach (TSource element in first)
if (set.Remove(element)) yield return element;
Sự khác biệt trong hai phương pháp là phương pháp của tôi sử dụng HashSet
và kiểm tra số lượng và Intersect
sử dụng set
đó là nhanh hơn so với HashSet
. Chúng tôi không cảnh báo hiệu quả của nó.
Các thử nghiệm:
static void Main(string[] args)
{
var a = Enumerable.Range(0, 100000);
var b = Enumerable.Range(10000000, 1000);
var t = new Stopwatch();
t.Start();
Repeat(()=> { Contain(a, b); });
t.Stop();
Console.WriteLine(t.ElapsedMilliseconds);//490ms
var a1 = Enumerable.Range(0, 100000).ToList();
var a2 = b.ToList();
t.Restart();
Repeat(()=> { Contain(a1, a2); });
t.Stop();
Console.WriteLine(t.ElapsedMilliseconds);//203ms
t.Restart();
Repeat(()=>{ a.Intersect(b).Any(); });
t.Stop();
Console.WriteLine(t.ElapsedMilliseconds);//190ms
t.Restart();
Repeat(()=>{ b.Intersect(a).Any(); });
t.Stop();
Console.WriteLine(t.ElapsedMilliseconds);//497ms
t.Restart();
a.Any(b.Contains);
t.Stop();
Console.WriteLine(t.ElapsedMilliseconds);//600ms
}
private static void Repeat(Action a)
{
for (int i = 0; i < 100; i++)
{
a();
}
}
trình như một say mê. Vì bạn là người trả lời đầu tiên nên tôi đã đánh dấu bạn là câu trả lời. Cảm ơn. – wahaha
Bạn không thể sử dụng 'a' cả dưới dạng danh sách và trong lambda. 'a.Any (a => b.Contains (a))'. Tôi sẽ đề nghị sử dụng một nhóm phương pháp thay vì 'a.Any (b.Contains)' – radbyx