有些时候需要从DataTable中选择出在某个列上相同的值。但是DataTable.Select没有提供这样的语法。于是,微软和一些其他大虾提供了解决方案。
据说以下这个是最快的:
private static DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames) { object[] lastValues; DataTable newTable; DataRow[] orderedRows; if (FieldNames == null || FieldNames.Length == 0) throw new ArgumentNullException("FieldNames"); lastValues = new object[FieldNames.Length]; newTable = new DataTable(); foreach (string fieldName in FieldNames) newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType); orderedRows = SourceTable.Select("", string.Join(", ", FieldNames)); foreach (DataRow row in orderedRows) { if (!fieldValuesAreEqual(lastValues, row, FieldNames)) { newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames)); setLastValues(lastValues, row, FieldNames); } } return newTable; } private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames) { bool areEqual = true; for (int i = 0; i < fieldNames.Length; i++) { if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]])) { areEqual = false; break; } } return areEqual; } private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames) { foreach (string field in fieldNames) newRow[field] = sourceRow[field]; return newRow; } private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames) { for (int i = 0; i < fieldNames.Length; i++) lastValues[i] = sourceRow[fieldNames[i]]; }
资料链接:
http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx
http://www.thescripts.com/forum/thread253513.html
http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1
.NET 2.0中还有一个DataView类的ToTable方法,但是据说很慢。
顺别推荐一个.NET面试题的网站:
http://www.dotnetuncle.com/aspnet/71_page_life_cycle.aspx