C# List去重


系統有一個批量發送郵件的功能,當該功能被觸發,需要發送郵件給該批次的選中的用戶,郵件內容包括用戶信息和訂單信息。

用戶和訂單是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; }



}
}




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM