C# List集合中获取重复值及集合运算详解
话不多说,直接上实例:
一、获取集合内重复值
publicvoidGetDuplicateValue()
{
ListlisA=newList{"A","B","C","A"};
//方式一借助字典
Dictionarydic=newDictionary();
lisA.ForEach(x=>
{
if(dic.ContainsKey(x))
dic[x]+=1;
else
dic[x]=0;
});
ListlisDupValues=dic.Where(x=>x.Value>0).Select(x=>x.Key).ToList();//结果{"A"}
//方式二
ListlisDupValues2=lisA.GroupBy(x=>x).Where(x=>x.Count()>1).Select(x=>x.Key).ToList();//结果{"A"}
//方式三等同于方式二
ListlisDupValues3=(fromrinlisAgrouprbyrintogwhereg.Count()>1selectg.Key).ToList();//结果{"A"}
}
由上述可看出方式二、三的写法非常简洁。便去Microsoft官网了解下了,又发现了许多新的东西,Linq还真是挺好用的
二、单个集合操作
1、All、Any
publicvoidAll_Any()
{
ListlisA=newList{"A","B","C","A"};
//All:确定序列中的所有元素是否都满足条件
boolall=lisA.All(x=>x.Equals("B"));//结果false
//Any:确定序列中的任何元素是否存在或满足条件。
boolany=lisA.Any(x=>x.Equals("B"));//结果true
}
2、Sum、Average、Distinct、Max、Min、Skip、Take、ToDictionary
publicvoidSum_Average_Distinct_Max_Min_Skip_Take_ToDictionary()
{
ListlisA=newList{1,2,2,3};
//Sum:计算数值序列的和。
doublesum=lisA.Sum();//结果8
//Average:计算数值序列的平均值。
doubleaverage=lisA.Average();//结果2
//Distinct:返回序列中的非重复元素
ListdistinctLisA=lisA.Distinct().ToList();//结果{1,2,3}
//Max:返回值序列中的最大值。
doublemax=lisA.Max();//结果3
//Min:返回值序列中的最小值。
doublemin=lisA.Min();//结果1
//Select:将序列中的每个元素投影到新表单。
varquery=lisA.Select((age,index)=>new{index,jn=age+1});//结果:{index=0,jn=2},{index=1,jn=3},{index=2,jn=3},{index=3,jn=4}
//Skip:跳过序列中指定数量的元素,然后返回剩余的元素。
ListlowerGrades=lisA.Skip(3).ToList();//结果{3}
//Take:从序列的开头返回指定数量的相邻元素。
Listtask=lisA.Take(2).ToList();//结果{1,2}
//ToDictionary:根据指定的键选择器函数、比较器和元素选择器函数,从IEnumerable创建一个Dictionary。
vardic=lisA.Distinct().ToDictionary(x=>x);//结果{{1,1},{2,2},{3,3}}
}
三、集合间运算
1、Concat、Except、Intersect、Union、Zip
publicvoidConcat_Except_Intersect_Union_Zip()
{
ListlisA=newList{"A","B","C","A"};
ListlisB=newList{"A","B","H","K"};
//Concat:连接两个序列。
Listquery=lisA.Concat(lisB).ToList();//结果{"A","B","C","A","A","B","H","K"}
//Except:生成两个序列的差集。
ListonlyInLisASet=lisA.Except(lisB).ToList();//结果{"C"}
//Intersect:生成两个序列的交集。
Listduplicates=lisA.Intersect(lisB).ToList();//结果{"A","B"}
//Union:生成两个序列的并集。
Listunion=lisA.Union(lisB).ToList();//结果{"A","B","C","H","K"}
//Zip:将指定函数应用于两个序列的对应元素,以生成结果序列。
Listzip=lisA.Zip(lisB,(first,second)=>first+""+second).ToList();//结果{"AA","BB","CH","AK"}
}
补充知识:c#中List的元素遍历(foreach)和去重复(distinct)
一、准备工作
定义实体类people
publicListPeopleList{get;set;} publicclassPeople { publicstringName{get;set;} publicintAge{get;set;} }
实体比较help类
publicdelegateboolCompareDelegate(Tx,Ty); publicclassListCompare :IEqualityComparer { privateCompareDelegate _compare; publicListCompare(CompareDelegate d) { this._compare=d; } publicboolEquals(Tx,Ty) { if(_compare!=null) { returnthis._compare(x,y); } else { returnfalse; } } publicintGetHashCode(Tobj) { returnobj.ToString().GetHashCode(); } }
二、List.ForEach()
假设需要对集合中的每个元素进行运算(将每个人的年龄增加10岁)
PeopleList.ForEach(p=>{
p.Age=p.Age+10;
});
三、List.Distinct()
假设需要将姓名和年龄相同的元素过滤掉
PeopleList.Distinct(newCommon.List.ListCompare( (x,y)=>x.Name==y.Name&&x.Age==y.Age) );
解析:
ListCompare类用来比较List中的两个元素。它的构造函数中需要传入一个CompareDelegate。
可以看出,两个元素的比较,重点在CompareDelegate中。
定义:publicdelegateboolCompareDelegate(Tx,Ty);
其实,ListCompare实现了IEqualityComparer接口。
以上这篇C#List集合中获取重复值及集合运算详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。