当前位置: 移动技术网 > IT编程>开发语言>c# > c# list部分操作实现代码

c# list部分操作实现代码

2019年07月18日  | 移动技术网IT编程  | 我要评论
c# linq获取两个list或数组的差集交集 复制代码 代码如下:list<int> list1 = newlist<int>();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也行啦!
当然我实际的源码比这更细致点,至此解决集合的差集的知识点就这些了

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网