zoukankan      html  css  js  c++  java
  • 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; }



    }
    }



  • 相关阅读:
    json的序列化 与 反序列化
    苹果审核被拒 2.3.10
    iOS基础问答面试
    论坛类应用双Tableview翻页效果实现
    iOS性能调优之Analyze静态分析
    win10 U盘安装ubuntu16.04双系统
    spring boot实战读书笔记1
    使用springBoot搭建REATFul风格的web demo
    es6编写generator报错
    vue开发环境搭建win10
  • 原文地址:https://www.cnblogs.com/nixjojo/p/2305153.html
Copyright © 2011-2022 走看看