选择DataTable中的唯一值(Distinct)

    开发中经常用到筛选DataTable等数据源中的唯一值(类似SQL中Distinct的返回结果),在.NET FX 1.x下我是这写的:
 1 None.gif static  DataTable SelectDistinct( string  ReturnTableName, DataTable SourceTable,  string  ReturnFieldName,  string  AdditionalFilterExpression)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gifDataTable dt = new DataTable(ReturnTableName);
 4InBlock.gifdt.Columns.Add(ReturnFieldName, SourceTable.Columns[ReturnFieldName].DataType);
 5InBlock.gifobject LastValue = null;
 6InBlock.gifforeach (DataRow dr in SourceTable.Select("", ReturnFieldName))
 7ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 8InBlock.gifif (LastValue == null || !(ColumnEqual(LastValue, dr[ReturnFieldName])))
 9ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
10InBlock.gifLastValue = dr[ReturnFieldName];
11ExpandedSubBlockStart.gifContractedSubBlock.gifdt.Rows.Add(new object[] dot.gif{ LastValue });
12ExpandedSubBlockEnd.gif}

13ExpandedSubBlockEnd.gif}

14InBlock.gifif (ds != null)
15InBlock.gifds.Tables.Add(dt);
16InBlock.gifreturn dt;
17ExpandedBlockEnd.gif}

18 None.gif
19 None.gif static   bool  ColumnEqual( object  A,  object  B)
20 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
21InBlock.gif// Compares two values to see if they are equal. Also compares DBNULL.Value.
22InBlock.gif// Note: If your DataTable contains object fields, then you must extend this
23InBlock.gif// function to handle them in a meaningful way if you intend to group on them.
24InBlock.gif
25InBlock.gifif (A == DBNull.Value && B == DBNull.Value) // both are DBNull.Value
26InBlock.gifreturn true;
27InBlock.gifif (A == DBNull.Value || B == DBNull.Value) // only one is DBNull.Value
28InBlock.gifreturn false;
29InBlock.gifreturn (A.Equals(B)); // value type standard comparison
30ExpandedBlockEnd.gif}

31 None.gif
后来这样写:
 1 None.gif private  DataTable SelectDistinct(DataTable sourceTable,  string  sourceColumn)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    DataTable result = null;
 4InBlock.gif    try
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 6InBlock.gif        result = new DataTable();
 7InBlock.gif        result.Columns.Add(sourceColumn, sourceTable.Columns[sourceColumn].DataType);
 8InBlock.gif        Hashtable ht = new Hashtable();
 9InBlock.gif        foreach (DataRow dr in sourceTable.Rows)
10ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
11InBlock.gif            if (!ht.ContainsKey(dr[sourceColumn]))
12ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
13InBlock.gif                ht.Add(dr[sourceColumn], null);
14InBlock.gif                DataRow newRow = result.NewRow();
15InBlock.gif                newRow[sourceColumn] = dr[sourceColumn];
16InBlock.gif                result.Rows.Add(newRow);
17ExpandedSubBlockEnd.gif            }

18ExpandedSubBlockEnd.gif        }

19InBlock.gif        return result;
20ExpandedSubBlockEnd.gif    }

21InBlock.gif    catch (System.Exception ex)
22ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
23InBlock.gif        ExceptionManager.Publish(ex);
24InBlock.gif        return null;
25ExpandedSubBlockEnd.gif    }

26InBlock.gif    finally
27ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
28InBlock.gif        if (result != null)
29InBlock.gif            result.Dispose();
30ExpandedSubBlockEnd.gif    }

31ExpandedBlockEnd.gif}

32 None.gif
33 None.gif

再后来又这样写:
 1 None.gif object [] distinctRoomType  =  GetDistinctValues(dt, " Roomtype " );
 2 None.gif
 3 None.gifHere  is  the method definition. 
 4 None.gif
 5 None.gif public   object [] GetDistinctValues(DataTable dtable, string  colName)
 6 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 7InBlock.gifHashtable hTable = new Hashtable();
 8InBlock.gifforeach(DataRow drow in dtable.Rows)
 9ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
10InBlock.giftry
11ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
12InBlock.gifhTable.Add(drow[colName],string.Empty);
13ExpandedSubBlockEnd.gif}

14ExpandedSubBlockStart.gifContractedSubBlock.gifcatchdot.gif{}
15ExpandedSubBlockEnd.gif}

16InBlock.gifobject[] objArray = new object[hTable.Keys.Count ];
17InBlock.gifhTable.Keys.CopyTo(objArray,0);
18InBlock.gifreturn objArray;
19ExpandedBlockEnd.gif}

20 None.gif
现在.NET FX 2.0中只要一句就可以搞定了,方便了许多:
1 ExpandedBlockStart.gif ContractedBlock.gif DataTable d  =  dataSetName.dataTableName.DefaultView.ToTable( true new   string []  dot.gif "ColumnName" } );


转载于:https://www.cnblogs.com/Zeus/archive/2006/10/31/546182.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值