本文转载:http://www.cnblogs.com/yjmyzz/archive/2012/12/18/2823170.html

今天写代码时,需要对一个数组对象中按一定规则合并、去重处理,不想再毫无新意手动写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#这般犀利,世界就更美好了 

利用Linq对集合元素合并、去重复处理的更多相关文章

  1. php数组存在重复的相反元素,去重复

    $arr1=array('a_b','c_d','b_a','d_c'); $arr2=array('a_b','c_d','b_a','d_c'); 条件: a_b==b_a:c_d==d_c: 需 ...

  2. 创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了; 如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变

    i汽车类 package com.lanxi.demo2_3; public class Car { private String name; private int price; @Override ...

  3. 如何将字符串去重复demo工具

    //方法一:使用集合的indexOf方法 public static void one(){ String string="aaaaaakkkkkkmnf";//需去重复的字符串s ...

  4. ASP.Net【如何合并DataTable,并且去重复方法】

    虽然DataTable.Merge可以很好的实现,但以下代码写出来更好理解 DataTable DataTable1 = new DataTable(); DataTable DataTable2 = ...

  5. 【原创】从 列表的重复 到 用sum展开二层嵌套列表将子元素合并

      转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9517159.html     ★像R语言里头有rep函数可以让向量的值重复,在python里面可以直 ...

  6. 如何求ArrayList集合的交集 并集 差集 去重复并集

    需要用到List接口中定义的几个方法: addAll(Collection<? extends E> c) :按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾 ...

  7. C#linq计算总条数并去重复的写法

    一,在实际需求中我们会存在选出了一个集合,而这时我们需要通过集合的某几个字段来计算重复,和统计重复的数量,这时我们可以用到linq来筛选和去重复. 二,如下代码: using System; usin ...

  8. java-ArrayList中去重复字符串或重复对象、LinkedList集合、泛型、增强for、静态导入、可变参数、asList()方法、集合嵌套

    1.去除ArrayList中重复字符串元素方式 * A:案例演示 * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) * 思路:创建新集合方式 /** * A:案例演示 * 需求 ...

  9. LINQ操作数组(交集,并集,差集,最值,平均,去重复)

    数组是大学里经常拿来做算法练习的对象.一些经典算法非常有价值,考试.装逼.面试都十分有用.但现在是效率时代,编程讲究生产效率,利用LINQ,可以让程序猿避免写一些基本算法,把精力花在业务处理上. 下面 ...

随机推荐

  1. MINA源码分析

    IoService通过构造函数的形式成为了IoSession一部分,IoSession是通过IoAcceptor以及connector创建出来,这二者其实就是IoService,所以对于IoSessi ...

  2. ubuntu16.04添加开机启动任务

    比如要把run-nexus.sh这个脚本制作成开机启动项. 系统工具->首选项->启动应用程序.添加该文件,即可.

  3. 导航 - 利用系统自带的App导航

    导航: 可以将需要导航位置丢给系统自带的App进行导航 发送网络请求到公司服务器, 获取导航数据, 自己手动绘制导航 利用三方SDK进行导航(百度) #import "ViewControl ...

  4. 如何通过SNMP的OID识别不同厂商的设备

    众所周知,SNMP作为通用的网络协议常用于系统监控之中,那么如何借助SNMP来识别不同厂商的设备呢? 事实上,在SNMP的OID树状图中专门有一个节点用于识别各不同的厂商,这个节点是: iso(1)  ...

  5. nc 命令汇总

    转自: http://blog.chinaunix.net/uid-20068039-id-359170.html 1.远程拷贝文件从server1拷贝文件到server2上.需要先在server2上 ...

  6. ANDROID_MARS学习笔记_S03_007_GoogleMap1

    一.简介 二.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <Linea ...

  7. 三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息

    三点经验:长时间运行函数需要随时发射信号报告进度,以及设置bool变量随时可以退出,每做一步操作必须及时记录和处理相关信息 不能到最后一起处理,否则万一中间出错了,这个记录状态就全部都乱了.

  8. Hibernate:1对1关系总结。

    QQ和QQ空间是1对1关系:配置如下 一.主键关联,双方共同维护表关系,以主键关联 public class QQ { private Long id; private QQZone zone; } ...

  9. GCC优化选项-fomit-frame-pointer对于esp和ebp优化的作用

    我的博客:www.while0.com -fomit-frame-pointer选项是发布产品时经常会用到的优化选项,它可以优化汇编函数中用edp协助获取堆栈中函数参数的部分,不使用edp,而是通过计 ...

  10. Android推送通知Notification

    参考: 1.http://www.cnblogs.com/anrainie/archive/2012/03/07/2383941.html 总结: 代码: