Henry Liang's Dot Net Blog

  Genius is one percent inspiration and ninety-nine percent perspiration.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
This block of code is to implement a "Select Distinct" data row from a data table.  The origin of this code is from http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx and http://support.microsoft.com/?id=326176
Unfortunately I can't distinguish which one comes first so I credit both of them.

Here's the code.

 1private static DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames)
 2{
 3     object[] lastValues;
 4     DataTable newTable;
 5     DataRow[] orderedRows;
 6
 7     if (FieldNames == null || FieldNames.Length == 0)
 8          throw new ArgumentNullException("FieldNames");
 9
10     lastValues = new object[FieldNames.Length];
11     newTable = new DataTable();
12
13     foreach (string fieldName in FieldNames)
14          newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);
15
16     orderedRows = SourceTable.Select(""string.Join("", FieldNames));
17
18     foreach (DataRow row in orderedRows)
19     {
20          if (!fieldValuesAreEqual(lastValues, row, FieldNames))
21          {
22               newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));
23
24               setLastValues(lastValues, row, FieldNames);
25          }

26     }

27
28     return newTable;
29}

30
31private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
32{
33     bool areEqual = true;
34
35     for (int i = 0; i < fieldNames.Length; i++)
36     {
37          if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]]))
38          {
39               areEqual = false;
40               break;
41          }

42     }

43
44     return areEqual;
45}

46
47private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
48{
49     foreach (string field in fieldNames)
50          newRow[field] = sourceRow[field];
51
52     return newRow;
53}

54
55private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
56{
57     for (int i = 0; i < fieldNames.Length; i++)
58          lastValues[i] = sourceRow[fieldNames[i]];
59}
 
60
61
posted on 2006-09-26 05:08  Henry Liang  阅读(727)  评论(0编辑  收藏  举报