由于.NET框架本身没有提供集合运算功能,在使用这方面的功能时,我们可以借助第三方的类库来实现。在NHibernate 框架中有个Iesi.Collection.dll,这个类库提供了集合运算功能,并且支持泛型。
功能: 主要是取得2个集合里,
相同、相异、联集的部份。
例子:
using
System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Iesi.Collections.Generic;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
ISet < string > Girls = new HashedSet < string > ();
Girls.Add( " Christine " );
Girls.Add( " Eva " );
Girls.Add( " Jean " );
Girls.Add( " Novia " );
Girls.Add( " Winnie " );
ISet < string > PMs = new HashedSet < string > ();
PMs.Add( " Eva " );
PMs.Add( " Novia " );
PMs.Add( " Vincent " );
PMs.Add( " Williams " );
PMs.Add( " Winnie " );
ISet < string > GirlPMs = Girls.Intersect(PMs);
Response.Write( " 是女生且是PM: <br /> " );
foreach ( string s in GirlPMs) {
Response.Write(s + " <br /> " );
}
Response.Write( " <br /> " );
ISet < string > GirlNotPMs = Girls.Minus(PMs);
Response.Write( " 是女生且不是PM: <br /> " );
foreach ( string s in GirlNotPMs) {
Response.Write(s + " <br /> " );
}
Response.Write( " <br /> " );
ISet < string > GirlOrPMs = Girls.Union(PMs);
Response.Write( " 是女生或是PM: <br /> " );
foreach ( string s in GirlOrPMs) {
Response.Write(s + " <br /> " );
}
Response.Write( " <br /> " );
ISet < string > NotMatch = Girls.ExclusiveOr(PMs);
Response.Write( " 是女生但不是PM,或是PM但不是女生: <br /> " );
foreach ( string s in NotMatch) {
Response.Write(s + " <br /> " );
}
}
}
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Iesi.Collections.Generic;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
ISet < string > Girls = new HashedSet < string > ();
Girls.Add( " Christine " );
Girls.Add( " Eva " );
Girls.Add( " Jean " );
Girls.Add( " Novia " );
Girls.Add( " Winnie " );
ISet < string > PMs = new HashedSet < string > ();
PMs.Add( " Eva " );
PMs.Add( " Novia " );
PMs.Add( " Vincent " );
PMs.Add( " Williams " );
PMs.Add( " Winnie " );
ISet < string > GirlPMs = Girls.Intersect(PMs);
Response.Write( " 是女生且是PM: <br /> " );
foreach ( string s in GirlPMs) {
Response.Write(s + " <br /> " );
}
Response.Write( " <br /> " );
ISet < string > GirlNotPMs = Girls.Minus(PMs);
Response.Write( " 是女生且不是PM: <br /> " );
foreach ( string s in GirlNotPMs) {
Response.Write(s + " <br /> " );
}
Response.Write( " <br /> " );
ISet < string > GirlOrPMs = Girls.Union(PMs);
Response.Write( " 是女生或是PM: <br /> " );
foreach ( string s in GirlOrPMs) {
Response.Write(s + " <br /> " );
}
Response.Write( " <br /> " );
ISet < string > NotMatch = Girls.ExclusiveOr(PMs);
Response.Write( " 是女生但不是PM,或是PM但不是女生: <br /> " );
foreach ( string s in NotMatch) {
Response.Write(s + " <br /> " );
}
}
}
运行结果:
是女生且是PM:
Eva
Novia
Winnie
是女生且不是PM:
Christine
Jean
是女生或是PM:
Christine
Eva
Jean
Novia
Winnie
Vincent
Williams
是女生但不是PM,或是PM但不是女生:
Christine
Williams
Jean
Vincent
Eva
Novia
Winnie
是女生且不是PM:
Christine
Jean
是女生或是PM:
Christine
Eva
Jean
Novia
Winnie
Vincent
Williams
是女生但不是PM,或是PM但不是女生:
Christine
Williams
Jean
Vincent
补充:
1. 如果顺序是重要的,那 HashedSet 可以改成 SortedSet
2. 如果用SortedSet, 集合里面的元素必需继承IComparable接口
3. 更详细的介绍可参考 Add Support for "Set" Collections to .NET