利用Linq对集合元素合并、去重复处理
时间:2022-04-23
本文章向大家介绍利用Linq对集合元素合并、去重复处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天写代码时,需要对一个数组对象中按一定规则合并、去重处理,不想再毫无新意手动写For循环遍历(天天写一样的代码很没劲),于是依旧linq,发现真心方便:
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqTest
{
class Program
{
static void Main()
{
List<Product> listProduct = new List<Product> {
new Product{StockNum=1,ProductNo="01",Tag="a"},
new Product{StockNum=2,ProductNo="01",Tag="b"},
new Product{StockNum=3,ProductNo="02",Tag="c"},
new Product{StockNum=4,ProductNo="02",Tag="d"},
new Product{StockNum=5,ProductNo="03",Tag="e"},
};
//注:处理目标->将"编号(ProductNo)"相同的产品记录,"库存量(StockNum)"合并,"附属标签(Tag)"合并
//合并处理
listProduct.ForEach(c => {
var group = listProduct.Where(a => a.ProductNo == c.ProductNo);
c.StockNum = group.Sum(x => x.StockNum);
c.Tag = group.Select(t => t.Tag).ToList().Join();
});
//去重复
listProduct = listProduct.Distinct(new ProductNoComparer()).ToList();
//输出验证
listProduct.ForEach(c =>
{
Console.WriteLine("ProductNo={0},StockNum={1},Tag={2}", c.ProductNo, c.StockNum, c.Tag);
});
//输出结果:
//ProductNo=01,StockNum=3,Tag=a,b
//ProductNo=02,StockNum=7,Tag=c,d
//ProductNo=03,StockNum=5,Tag=e
Console.Read();
}
}
/// <summary>
/// 工具类(一般开发中,可定义在自己的工具类库里)
/// </summary>
static class Utils {
/// <summary>
/// List扩展方法,将List元素用分隔符连接后,返回字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="splitStr"></param>
/// <returns></returns>
public static String Join<T>(this List<T> list, string splitStr=",")
{
string result = string.Empty;
foreach (var item in list)
{
result += item.ToString() + splitStr;
}
return result.Trim(splitStr.ToCharArray());
}
}
/// <summary>
/// 产品实体类
/// </summary>
class Product
{
/// <summary>
/// 库存
/// </summary>
public int StockNum { set; get; }
/// <summary>
/// 产品编号
/// </summary>
public String ProductNo { set; get; }
/// <summary>
/// 附属标签
/// </summary>
public String Tag { set; get; }
}
/// <summary>
/// 去"重复"时候的比较器(只要ProductNo相同,即认为是相同记录)
/// </summary>
class ProductNoComparer : IEqualityComparer<Product>
{
public bool Equals(Product p1, Product p2)
{
if (p1 == null)
return p2 == null;
return p1.ProductNo == p2.ProductNo;
}
public int GetHashCode(Product p)
{
if (p == null)
return 0;
return p.ProductNo.GetHashCode();
}
}
}
其它编程语言如果都象C#这般犀利,世界就更美好了
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JAVA反射功能
- Git
- Bootstrap实用功能总结
- Bootstrap基础学习笔记
- 基于Paddle Lite在Android手机上实现图像分类
- redis学习笔记-set
- 图解一致性哈希算法,全网(小区局域网)最通俗易懂
- ES 创建索引时使用Dynamic Mapping动态映射 对字符串字段生成keyword字段
- Java 报错信息 Error during JavaScript execution
- 记录一次SpringBoot Autowired为null的错误
- Collection接口-常用方法
- Qt开源作品34-qwt无需插件源码
- Qt开源作品35-秘钥生成器
- Qt开源作品36-程序守护进程
- Qt开源作品37-网络中转服务器