Cách chọn các hàng riêng biệt trong một dữ liệu và lưu trữ thành một mảng


167

Tôi có một tập dữ liệu objds. objds chứa một bảng có tên là 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. Điều này có thể.

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

Đăng mã mẫu, từ một nhận xét bạn đưa ra dưới đây, có vẻ như câu trả lời xoay quanh các chi tiết cụ thể của truy vấn bạn đang làm việc.
MatthewMartin

Câu trả lời:


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


Nếu tôi có 2 cột "mo" và "name" tôi cần lấy "mo" riêng biệt nhưng không phải là "tên" riêng biệt nhưng tôi cần giữ cột "tên" trong khả năng truy cập của mình thì tôi phải làm gì?
Người dùng7291

1
@JocelyneElKhoury, điều đó không thực sự có ý nghĩa ... bạn sẽ giữ giá trị nào của "tên"?
Thomas Levesque

@ThomasLevesque không quan trọng cái nào ... giả sử tôi cần giữ giá trị đầu tiên của tên
User7291

17
OK, sau đó bạn cần nhóm, không phân biệt. Bạn có thể làm điều đó với Linq to Dataset:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Thomas Levesque

148

Theo sau một dòng mã sẽ tránh các hàng trùng lặp của a DataTable:

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

Ở đâu:

  • tham số đầu tiên trong ToTable()là một 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 vào đó chúng ta phải chọn các hàng riêng biệt. Chỉ những cột này sẽ ở trong dữ liệu được trả về.

Điều tương tự có thể được thực hiện từ một DataSet, bằng cách truy cập một cụ thể DataTable:

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

5
tôi thích câu trả lời này nhất, vì nó chỉ ra DefaultViewtài sản của a DataTable.
Ian Boyd

Nếu tôi cần phân biệt dựa trên hai cột thì sao?
LCJ

1
@Lijo, ToTable(boolean, params string[] columnNames)phương thức cho phép nhiều cột được chỉ định.
Võng Kristen

57
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();

30

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();

@Adi Lester: có thể chọn mới {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinc (); đúng hơn không?
Urik

Khi bạn chỉ có Danh sách <DataRow>, bạn có thể thực hiện việc này: var test = (từ DataRow dRow trong vm.LiveAssets chọn dRow ["manname"]). Distinc ();
pat capozzi

Dòng đầu tiên hoạt động. Thứ hai, như Urik chỉ ra là không, nhưng Urik cũng không hoạt động vì Phân biệt () sẽ không tìm thấy sự bình đẳng khi thực hiện so sánh đối tượng trên các loại ẩn danh.
Alan Baljeu

9

Để cải thiện câu trả lời trên: Hàm ToTable trên dataview có cờ "khác biệt".

//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 tình trạng quá tải với một tham số Boolean riêng biệt trong đó và nó yêu cầu mảng tham số. Tôi nghĩ rằng điều này sẽ chỉ trả về một bảng gọi là "Đúng" mà không áp dụng bất kỳ DISTINCT nào.
kiêu hãnh

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

4

Sau công trình. Tôi có nó hoạt động với 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);

3

Tôi chỉ tình cờ tìm thấy cái 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

Tôi giả sử OP đang tìm kiếm sự khác biệt trong khi sử dụng DataTable.Select (). (Chọn () không hỗ trợ khác 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
    }
}

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;
}

2

Cú pháp: -

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

VÍ DỤ:-

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");

2

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

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

Điều này chỉ hợp lệ cho asp.net 4.0 ^ Framework và nó cần tham chiếu đến System.Data.DataSetExtensions như Ivan Ferrer Villa đã chỉ ra


1
có lẽ nó cần tham chiếu đếnSystem.Data.DataSetExtensions
Ivan Ferrer Villa

1
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();

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 kết hợp được coi là duy nhất


0

nó rất dễ dàng

    DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");

và dữ liệu dt2 chứa dữ liệu duy nhất cột1, Cột2..ColumnNth.


0
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();

Xin chào @ GálGyula, chào mừng bạn đến với Stack Overflow! Ở đây chúng tôi quan tâm đến câu trả lời với lời giải thích tốt, không chỉ mã. Chỉ đăng một câu trả lời nếu nó thực sự giải quyết được câu hỏi và bạn có thể giải thích làm thế nào. Để cải thiện câu trả lời trong tương lai của bạn, hãy xem hướng dẫn làm thế nào để tôi viết một câu trả lời hay .
Erick Petrucelli

-1

Thở như thế nào?

CHỌN DISTINCT .... TỪ bảng Điều kiện ở đâu

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

lưu ý: Câu hỏi bài tập về nhà? và chúa phù hộ cho google ..

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


3
để bất kỳ ai hạ thấp tôi: S ,, rõ ràng câu hỏi đã được sửa đổi sau câu trả lời của tôi ?? (trả lời 10:15, câu hỏi được chỉnh sửa vào 12:15) oh tốt .. thx cho sự thiếu hiểu biết của bạn :)
Madi D.

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

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.