所以我写了这个简单的控制台应用程序来帮助我提出问题。在方法的第 3 行使用 lambda 表达式来获取公共(public)成员的正确方法是什么。尝试了 Join() 但无法找出正确的语法。作为后续...是否有一种非 LINQ 方法可以在我错过的一行中执行此操作?

class Program
{
    static void Main(string[] args)
    {
        List<int> c = new List<int>() { 1, 2, 3 };
        List<int> a = new List<int>() { 5, 3, 2, 4 };
        IEnumerable<int> j = c.Union<int>(a);
        // just show me the Count
        Console.Write(j.ToList<int>().Count.ToString());

    }
}

最佳答案

你想要 Intersect() :

IEnumerable<int> j = c.Intersect(a);

这是一个基于评论中提到的想法的 OrderedIntersect() 示例。如果您知道序列是有序的,则它应该运行得更快— O(n),而不是通常的.Intersect()(不要忘了脑袋)。但是如果你不知道它们是有序的,它可能根本不会返回正确的结果:
public static IEnumerable<T> OrderedIntersect<T>(this IEnumerable<T> source, IEnumerable<T> other) where T : IComparable
{
    using (var xe = source.GetEnumerator())
    using (var ye = other.GetEnumerator())
    {
        while (xe.MoveNext())
        {
           while (ye.MoveNext() && ye.Current.CompareTo(xe.Current) < 0 )
           {
              // do nothing - all we care here is that we advanced the y enumerator
           }
           if (ye.Current.Equals(xe.Current))
              yield return xe.Current;
           else
           {  // y is now > x, so get x caught up again
              while (xe.MoveNext() && xe.Current.CompareTo(ye.Current) < 0 )
              { } // again: just advance, do do anything

              if (xe.Current.Equals(ye.Current)) yield return xe.Current;
           }

        }
    }
}

10-05 20:53
查看更多