系統有一個批量發送郵件的功能,當該功能被觸發,需要發送郵件給該批次的選中的用戶,郵件內容包括用戶信息和訂單信息。
用戶和訂單是1對多的關系。現在,當批量發送郵件時,用戶有幾個訂單就會收到幾封郵件,分別含有不同訂單的信息。
要求,將同一用戶的所有訂單合並到一封郵件中。
下面是我的做法(只適用於少量數據,數據量大的話需要仔細斟酌更優的方法):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class UserOrder
{
static void Main(string[] args)
{
List<Order> orderList = new List<Order>(); //創建Order List
Order o1 = new Order();
o1.OrderId = "Order1";
o1.OrderUser = "User1";
Order o2 = new Order();
o2.OrderId = "Order1";
o2.OrderUser = "User2";
Order o3 = new Order();
o3.OrderId = "Order2";
o3.OrderUser = "User1";
Order o4 = new Order();
o4.OrderId = "Order2";
o4.OrderUser = "User2";
orderList.Add(o1);
orderList.Add(o2);
orderList.Add(o3);
orderList.Add(o4);
foreach (Order o in orderList)//打印出原始Order列表,結果見下圖第一部分
{
Console.WriteLine(o.OrderUser + "," + o.OrderId);
}
Console.WriteLine("----------------------------");
Console.ReadLine();
//創建User List
List<User> userList = new List<User>();
//對所有用戶進行2層循環,目的在於將屬於同一個用戶的訂單都放在該用戶名下。這里的結果就是得出一個新的列表,同樣的User將出現若干次(他的訂單的次數)。
//結果見下圖第二部分
foreach (Order o in orderList)
{
User user = new User();
user.UserId = o.OrderUser;
List<Order> newOrderList = new List<Order>();
foreach (Order newO in orderList)
{
if (newO.OrderUser == o.OrderUser)
newOrderList.Add(newO);
}
user.Orders = newOrderList;
userList.Add(user);
}
foreach (User u in userList)
{
string result = "";
foreach (Order order in u.Orders)
{
result += order.OrderId + ",";
}
Console.WriteLine(u.UserId + ", {" + result + "}");
}
Console.WriteLine("----------------------------");
Console.ReadLine();
//前面得到的列表是有若干重復記錄的,這里就要進行去重,用user_collection_DistinctBy_userId這個比較器。
//結果見下圖第三部分
List<User> newUserList = userList.Distinct(new user_collection_DistinctBy_userId()).ToList();
foreach (User u in newUserList)
{
string result = "";
foreach (Order order in u.Orders)
{
result += order.OrderId + ",";
}
Console.WriteLine(u.UserId + ", {" + result + "}");
}
Console.WriteLine("----------------------------");
Console.ReadLine();
}
}
//user_collection_DistinctBy_userId比較器,繼承自IEqualityComparer接口。
public class user_collection_DistinctBy_userId : IEqualityComparer<User>
{
public bool Equals(User x, User y)
{
if (x.UserId == y.UserId)
{
return true;
}
else
{
return false;
}
}
public int GetHashCode(User obj)
{
return 0;
}
}
public class Order
{
public string OrderId { get; set; }
public string OrderUser { get; set; }
}
public class User
{
public string UserId { get; set; }
public List<Order> Orders { get; set; }
}
}