如何进行内部联接,在C#中的集合之间保留outerjoin



我有两个集合,其中的项目数量更多,比如一百万。我想在C#中对它们进行比较,找出以下内容

  1. 如何查找Orders1和Orders2之间的匹配项
  2. 如何查找Orders2中的Orders1
  3. 如何查找Orders1中的Orders2
  4. 如何查找不在Orders2中的Orders1
  5. 如何查找不在Orders1中的Orders2
public class Order
{
public int OrderID { get; set; }       
public string OrderDate { get; set; }
public string StoreID { get; set; }
public float TotalPrice { get; set; }
}

static void Main(string[] args)
{
List<Order> Orders1 = new List<Order>();
Orders1.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders1.Add(new Order { OrderID = 2, StoreID = "A02", TotalPrice = 12.2F });
Orders1.Add(new Order { OrderID = 3, StoreID = "A03", TotalPrice = 12.3F });
Orders1.Add(new Order { OrderID = 4, StoreID = "A04", TotalPrice = 12.4F });
Orders1.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders1.Add(new Order { OrderID = 5, StoreID = "A05", TotalPrice = 12.5F });

List<Order> Orders2 = new List<Order>();
Orders2.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders2.Add(new Order { OrderID = 2, StoreID = "A02", TotalPrice = 12.2F });
Orders2.Add(new Order { OrderID = 2, StoreID = "A03", TotalPrice = 12.2F });
Orders2.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders2.Add(new Order { OrderID = 5, StoreID = "A05", TotalPrice = 12.5F });
Orders2.Add(new Order { OrderID = 6, StoreID = "A06", TotalPrice = 12.6F });
Orders2.Add(new Order { OrderID = 7, StoreID = "A07", TotalPrice = 12.7F });
}

性能重要吗?请记住,您可以在O(mn(中检查所有这些,其中mn分别是Orders1和Orders2的大小。

  1. 如果性能不那么重要,那么采用简单的2个周期方法:
  • 有5个列表(每个案例一个(,并对您的订单进行相应分类
  1. 如果性能是一个重要因素,那么:
  • 了解如何实现IComparable,因为您需要比较三件事:OrderID、StoreID和TotalPrice。您需要在Order类中实现它。谷歌是你的朋友。以下是一个示例:https://www.geeksforgeeks.org/c-sharp-program-to-implement-icomparable-interface/#:~:text=C%23%20提供%20an%20IComparable%20接口,在%20which%20的基础上%20到%20排序。

  • 然后,您需要创建自己的List类,并使用二进制搜索进行插入。然后,当你在列表中滚动时,你的搜索速度会更快。

在这两种情况下,你都应该(如果你有足够的内存,这不是必须的(根据一些标准对两个列表进行排序(可能OrderID,IComparable也会有所帮助(,当你对订单进行分类时,删除它们两个订单列表,这样你就不会有2个数百万的列表+5个分类订单的列表。再次学习记忆管理。

根据我的个人经验,不要使用lambda表达式。如果你声称每个列表中有超过一百万个条目,你可能会遇到内存问题。

我个人的建议是:学会实现IComparable并创建自己的插件。我认为这个练习的教训是学习如何在拥有数百万行数据的情况下解决这类问题。

看看C#联接子句。包含如何实现的完整文档

  • 内部联接
  • 群组加入
  • 左侧外部联接

,然后使用Join操作查询以提取数据。

var intersecting = from o1 in Orders1
join o2 in Orders2 on o1.OrderID equals o2.OrderID
select o1;
var result = from x in Orders1
join y in Orders2 on x.OrderID equals y.OrderID
select x; //1

Orders1.Where(x=>Orders2.Any(y=>y.OrderID == x.OrderID )); //2
Orders2.Where(x=>Orders1.Any(y=>y.OrderID == x.OrderID )); //3
Orders1.Where(p => Orders2.All(p2 => p2.OrderID != p.OrderID)); //4
Orders2.Where(p => Orders1.All(p2 => p2.OrderID != p.OrderID)); //5

最新更新