欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c# list部分操作实现代码

程序员文章站 2023-12-21 08:56:10
c# linq获取两个list或数组的差集交集 复制代码 代码如下:list list1 = newlist();list1....

c# linq获取两个list或数组的差集交集

复制代码 代码如下:

list<int> list1 = newlist<int>();
list1.add(1);
list1.add(2);
list1.add(3);
list<int> list2 = newlist<int>();
list2.add(3);
list2.add(4);
list2.add(5);
//得到的结果是4,5 即减去了相同的元素。
list<int> list3 = list2.except(list1).tolist();
foreach(inti inlist3)
{
messagebox.show(i.tostring());
}

合并两个数组,并去掉重复元素,然后排序(c#)

复制代码 代码如下:

list<int> numbers1 = newlist<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 12, 10};
list<int> numbers2 = newlist<int>() { 15, 14, 11, 13, 19, 18, 16, 17, 12, 10};
varnewquerty = numbers1.concat(
fromn innumbers2
where!numbers1.contains(n)
selectn
).orderby(n=>n);

合并两个数组,并去除合并后的重复数据, 并排序

复制代码 代码如下:

int[] a={1,2,2,3,4,5,6,6,6};
int[] b={2,2,2,3,7,8,9,5};

list<int> list = new list<int>(a);
list.addrange(b);

list.sort();

//去除重复项
foreach (int i in list.distinct<int>())
{
console.writeline(i);
}

c# 取两个数组的相同元素
以往我们都是肯定绞尽脑汁,肯定什么循环,元素大小,什么因素都考虑进去。但是现在采用linq可以很好的解决这个问题。找出两个或多个数组的相同项。

代码相当简单:

复制代码 代码如下:

usingsystem;
usingsystem.collections.generic;
usingsystem.linq;
usingsystem.text;
namespacetest4_03
{
classprogram
{
staticvoidmain(string[] args)
{
string[] names = {"adams","arthur","buchanan","tsbuchis","shcian","fuchsialinda","dechechen","lotheer","findlancicade","sorchland","jiangzheng","misiiloda","gtod","dfac","lama","bakcades","losangle","zhewq","gehengdahalothi","torylandey","dakalothy","bthlanda","mennorth","fith","foxmain","dontm","saobba","del","sala","ghero","bhthlaphda"};
ienumerable<string> skip = names.skip(10);
ienumerable<string> take = names.take(11);
//取出两个序列中交集部分,按理论应该输出jiangzheng
ienumerable<string> intersect = skip.intersect(take);
foreach(varsinintersect)
{
console.writeline(s);
}
console.readkey();
}
}
}

c# 获取两个数组集合的差集,交集
今天在做一个树形选择节点时,遇到一个问题,属性节点是记录了相关的id值,第一次呢全部对这些id进行处理,但是接下来再次选择就要分情况了,原先选择的id如果不在新选择的集合中那么剔除掉,否则,原先id不传入函数处理,新id传入函数处理:

比如原来
①选择的id是:1,2,3,4 下次:1,2,3,4,5, 那么这时候5要处理,1,2,3,4维持原样。
②选择id是:1,3 下次: 3,4,5 那么这时候4,5 要处理,3 维持原样。1剔除。
③选择id是:1,2,3,4,5 下次:3,4,5 那么这时候3,4,5都维持原样,1,2剔除。
④选择id是:1,2 下次:3,4,5 那么这时候3,4,5处理,1,2剔除。

简化一下数学模型:

大家发现没其实这就是一个数学的概念,集合的差集,那么我们怎么处理呢? 假设前次选择的集合为a,后次选择为b

得到要处理的很简单:b-a (b与a的差集)就是要处理的集合元素,为什么呢?根据概念可知哈!

那么得到不做处理的怎么办呢? 不要处理的必然是b的子集,那么怎么得到呢?

出来啦既是:b-(b-a) 这是为什么呢? b-a 就是要处理的,而维持原样的就是当然就是:b-(b-a),

那么剔除的集合呢? a-(b-(b-a))

如何用c#表示呢,我这里就不用什么循环之类的了,我用的是net3.5 那就好办了,用linq处理:

俺这里特殊点,右键得到的树形集合(lstsource)包含了其他信息,先获取id集合再说:

复制代码 代码如下:

var m_ilallselect = lstsource.select(r => r.id).asenumerable();//新选择的列表

///////下面开始处理了

list<int> m_ilnewselect = m_ilallselect.tolist();//新选择列表
list<int> m_ilexcept = m_ilnewselect.except(m_mcuids).tolist(); //两者的不同之处
list<int> m_iexceptafterandnew = m_ilnewselect.except(m_ilexcept).tolist();//新选择列表与差集比较,则是新选择中的旧的

为了简化给大家,这里的a代表旧集合,b代表新集合,这里的集合都是list<int>泛型列表。
那么要处理的就是 b.except(a), 维持原样的:b( b.except(a)), 剔除的:a.except(b( b.except(a))),
不要问我这个except方法啥意思?看msdn吧,google也行啦!
当然我实际的源码比这更细致点,至此解决集合的差集的知识点就这些了

上一篇:

下一篇: