2009-07-29 42 views
139

Tôi có tập dữ liệu objds. objds chứa một bảng có tên Table1. Bảng 1 chứa cột có tên ProcessName. ProcessName này chứa các tên lặp đi lặp lại. Vì vậy, tôi muốn chỉ chọn các tên riêng biệt. Có thể điều này.Cách chọn các hàng riêng biệt trong một dữ liệu và lưu vào một mảng

intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString()); 
+0

Viết mã mẫu, từ nhận xét bạn đã thực hiện bên dưới, có vẻ như câu trả lời xoay quanh chi tiết cụ thể của truy vấn mà bạn đang làm việc. – MatthewMartin

Trả lời

311
DataView view = new DataView(table); 
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...); 
+0

http://www.codeproject.com/Tips/153008/Select-DISTINCT-records-based-on-specified-fields – Charmie

+0

nếu tôi có 2 cột "mo" và "name" tôi cần để có được "mo" riêng biệt nhưng không phải là "tên" riêng biệt nhưng tôi cần phải giữ cho cột "tên" trong mục dữ liệu của tôi phải làm gì? – User7291

+0

@JocelyneElKhoury, điều đó không thực sự hợp lý ... bạn sẽ giữ giá trị của "tên" nào? –

1

sthing như thế nào?

SELECT DISTINCT .... FROM table WHERE điều kiện

http://www.felixgers.de/teaching/sql/sql_distinct.html

lưu ý: Bài tập về nhà câu hỏi? và god bless google ..

http://www.google.com/search?hl=en&rlz=1C1GGLS_enJO330JO333&q=c%23+selecting+distinct+values+from+table&aq=f&oq=&aqi=

+3

để bất cứ ai downvoted tôi: S ,, rõ ràng là câu hỏi đã được sửa đổi sau khi câu trả lời của tôi ?? (câu trả lời 10:15, câu hỏi được chỉnh sửa trên 12:15) oh well .. thx vì sự thiếu hiểu biết ur :) –

+1

OP hỏi làm thế nào để chọn các hàng riêng biệt trong môi trường C# ado.net, không phải trong một cơ sở dữ liệu thực tế. – aggaton

53
DataTable dt = new DataTable(); 
dt.Columns.Add("IntValue", typeof(int)); 
dt.Columns.Add("StringValue", typeof(string)); 
dt.Rows.Add(1, "1"); 
dt.Rows.Add(1, "1"); 
dt.Rows.Add(1, "1"); 
dt.Rows.Add(2, "2"); 
dt.Rows.Add(2, "2"); 

var x = (from r in dt.AsEnumerable() 
     select r["IntValue"]).Distinct().ToList(); 
8

Để cải thiện câu trả lời ở trên: Chức năng ToTable trên dataview có một "biệt" cờ.

//This will filter all records to be distinct 
dt = dt.DefaultView.ToTable(true); 
+1

Điều này dường như không hoạt động. Chỉ có một quá tải với một tham số Boolean riêng biệt trong nó và nó đòi hỏi mảng tham số. Tôi nghĩ rằng điều này sẽ chỉ trả lại một bảng gọi là "Đúng" mà không có bất kỳ DISTINCT nào được áp dụng. – proudgeekdad

+2

+1 Điều này thực sự không hoạt động (ít nhất là trong .NET 4.5). Nếu bạn chỉ định giá trị Boolean "True" làm tham số duy nhất, nó thực hiện DISTINCT trên tất cả các cột trong DataView. – SetFreeByTruth

2

Tôi chỉ tình cờ tìm thấy điều này: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Trong khi tìm kiếm một cái gì đó tương tự, chỉ, đặc biệt cho .net 2.0

Im giả sử OP đang tìm kiếm riêng biệt trong khi sử dụng DataTable .Lựa chọn(). (Chọn() không hỗ trợ riêng biệt)

Vì vậy, đây là mã từ liên kết ở trên:

class DataTableHelper 
{ 
    public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName) 
    { 
     DataTable dt = new DataTable(TableName); 
     dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType); 

     object LastValue = null; 
     foreach (DataRow dr in SourceTable.Select("", FieldName)) 
     { 
      if ( LastValue == null || !(ColumnEqual(LastValue, dr[FieldName]))) 
      { 
       LastValue = dr[FieldName]; 
       dt.Rows.Add(new object[]{LastValue}); 
      } 
     } 

     return dt; 
    } 

    private bool ColumnEqual(object A, object B) 
    { 

     // Compares two values to see if they are equal. Also compares DBNULL.Value. 
     // Note: If your DataTable contains object fields, then you must extend this 
     // function to handle them in a meaningful way if you intend to group on them. 

     if (A == DBNull.Value && B == DBNull.Value) // both are DBNull.Value 
      return true; 
     if (A == DBNull.Value || B == DBNull.Value) // only one is DBNull.Value 
      return false; 
     return (A.Equals(B)); // value type standard comparison 
    } 
} 
126

Tiếp theo dòng mã sẽ tránh được các hàng trùng lặp của một DataTable:

dataTable.DefaultView.ToTable(true, "employeeid"); 

đâu:

  • tham số đầu tiên trong ToTable()boolean cho biết bạn có muốn các hàng riêng biệt hay không.

  • tham số thứ hai trong ToTable() là tên cột dựa trên đó chúng tôi phải chọn các hàng riêng biệt. Chỉ những cột này sẽ ở trong dữ liệu trả về được.

Cùng thể được thực hiện từ một DataSet, bằng cách truy cập một cụ DataTable:

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid"); 
+5

Tôi thích câu trả lời này nhất, vì nó trỏ đến thuộc tính 'DefaultView' của' DataTable'. –

+12

Tôi thích nó nhất vì nó giải thích mã được sử dụng :) – Rachel

+0

Điều gì sẽ xảy ra nếu tôi cần phân biệt dựa trên hai cột? – Lijo

28

Với LINQ (.NET 3.5, C# 3)

var distinctNames = (from row in DataTable.AsEnumerable() 
select row.Field<string>("Name")).Distinct(); 

foreach (var name in distinctNames) { Console.WriteLine(name); } 
13
var distinctRows = (from DataRow dRow in dtInventory.Rows 
           select dRow["column_name"]).Distinct(); 

var distinctRows = (from DataRow dRow in dtInventory.Rows 
           select dRow["col1"], dRow["col2"]..).Distinct(); 
+0

@Adi Lester: có thể chọn {col1 = dRow ["col1"] mới, col2 = dRow ["col2"], ...}) .Distinct(); chính xác hơn? – Urik

+0

Khi bạn chỉ có một Danh sách bạn có thể làm điều này: var test = (từ DataRow dRow trong vm.LiveAssets chọn dRow ["manname"]). –

3

Tiếp theo công trinh. Tôi có nó làm việc cho tôi với NET 3.5 SP1

// Create the list of columns 
String[] szColumns = new String[data.Columns.Count]; 
for (int index = 0; index < data.Columns.Count; index++) 
{ 
    szColumns[index] = data.Columns[index].ColumnName; 
} 

// Get the distinct records 
data = data.DefaultView.ToTable(true, szColumns); 
1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable() 
select Rows["ColumnName"]).Distinct().ToList(); 
13

Bạn có thể sử dụng như thế:

dataDataTable

data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7"); 

nhưng hiệu suất sẽ giảm. hãy thử sử dụng mã bên dưới:

data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList(); 

Để thực hiện; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html

1

Cú pháp: -

DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName"); 

EX: -

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName"); 
2
string[] TobeDistinct = {"Name","City","State"}; 
DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct); 

//Following function will return Distinct records for Name, City and State column. 
public static DataTable GetDistinctRecords(DataTable dt, string[] Columns) 
{ 
    DataTable dtUniqRecords = new DataTable(); 
    dtUniqRecords = dt.DefaultView.ToTable(true, Columns); 
    return dtUniqRecords; 
} 
1
DataTable dt = new DataTable("EMPLOYEE_LIST"); 

DataColumn eeCode = dt.Columns.Add("EMPLOYEE_CODE", typeof(String)); 
DataColumn taxYear = dt.Columns.Add("TAX_YEAR", typeof(String)); 
DataColumn intData = dt.Columns.Add("INT_DATA", typeof(int)); 
DataColumn textData = dt.Columns.Add("TEXT_DATA", typeof(String)); 

dt.PrimaryKey = new DataColumn[] { eeCode, taxYear }; 

Nó lọc bảng dữ liệu với eecode và taxyear combinedly coi là độc đáo

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable(); 
.210
0

Giải pháp đơn giản nhất là sử dụng LINQ và sau đó chuyển kết quả vào một DataTable

//data is a DataTable that you want to change 
    DataTable result = data.AsEnumerable().Distinct().CopyToDataTable <DataRow>(); 

này có hiệu lực cho asp.net 4.0^Khung nếu tôi nhớ.

Các vấn đề liên quan