Як вибрати окремі рядки в таблиці даних та зберегти їх у масив


167

У мене є obdds набору даних. objds містить таблицю з назвою Table1. Таблиця1 містить стовпець під назвою ProcessName. Це ProcessName містить неодноразові імена. Тому я хочу вибрати лише окремі імена. Це можливо.

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

Опублікуйте зразок коду із коментаря, який ви зробили нижче, схоже, що відповідь залежить від специфіки запиту, з яким ви працюєте.
MatthewMartin

Відповіді:


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


якщо у мене є 2 стовпчики "мо" та "ім'я", мені потрібно отримати чітке "мо", але не чітке "ім'я", але мені потрібно зберегти стовпець "ім'я" у моїй таблиці даних, що робити?
User7291

1
@JocelyneElKhoury, це насправді не має сенсу ... яке значення "ім'я" ви збережете тоді?
Томас Левеск

@ThomasLevesque не має значення, який з них ... скажімо, мені потрібно зберегти перше значення імені
User7291

17
Гаразд, тоді вам потрібно групування, а не чітке. Ви можете зробити це з Linq для DataSet:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
Томас Левеск

148

Наступний рядок коду дозволить уникнути повторюваних рядків DataTable:

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

Де:

  • Перший параметр в ToTable()- булевий, який вказує на те, чи потрібно чіткі рядки чи ні.

  • Другий параметр у ToTable()- це ім'я стовпця, на основі якого ми повинні вибрати окремі рядки. Тільки ці стовпці будуть у поверненій таблиці даних.

Те ж саме можна зробити з DataSet, отримавши доступ до певного DataTable:

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

5
мені найбільше подобається ця відповідь, оскільки вона вказує на DefaultViewвластивість a DataTable.
Ян Бойд

Що робити, якщо мені потрібно розрізнити на основі двох стовпців?
LCJ

1
@Lijo, ToTable(boolean, params string[] columnNames)метод дозволяє вказати кілька стовпців.
Крістен Хаммак

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

За допомогою 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); }

15

Ви можете використовувати так:

data є DataTable

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

але продуктивність знизиться. спробуйте використовувати код нижче:

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

Для продуктивності; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html


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: можливо, виберіть новий {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); правильніше?
Урік

Коли у вас є лише список <DataRow>, ви можете зробити це: var test = (від DataRow dRow в vm.LiveAssets виберіть dRow ["manname"]). Distinct ();
pat capozzi

Перший рядок працює. По-друге, як зазначає Урік, це не так, але Urik також не працює, оскільки Distinct () не знайде рівності при виконанні об'єктів-порівняння за анонімними типами.
Алан Балюу

9

Для вдосконалення вищезазначеної відповіді: Функція ToTable у режимі перегляду даних має прапор "чітко".

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

1
Схоже, це не працює. Існує лише одна перевантаження з чітким булевим параметром в ньому, і для цього потрібен масив параметрів. Я думаю, що це просто поверне таблицю під назвою "True" без будь-якого застосованого DISTINCT.
ponosgeekdad

2
+1 Це насправді працює (принаймні, у .NET 4.5). Якщо ви вказали булеве значення "True" як єдиний параметр, воно виконує DISTINCT у всіх стовпцях DataView.
SetFreeByTruth

4

Наступні роботи. У мене це працює для .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

Щойно я виявив це: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

Шукаєте щось подібне лише спеціально для .net 2.0

Я припускаю, що ОП шукала чіткого під час використання DataTable.Select (). (Вибір () не підтримує відмінності)

Отже, ось код із наведеного вище посилання:

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

Синтаксис: -

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

EX: -

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

2

Найпростішим рішенням є використання LINQ, а потім перетворення результату в DataTable

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

Це дійсно лише для asp.net 4.0 ^ Framework, і воно потребує посилання на System.Data.DataSetExtensions, як вказував Іван Феррер Вілла


1
можливо, воно потребує посилання наSystem.Data.DataSetExtensions
Іван Феррер Вілла

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

Він фільтрує таблицю даних за допомогою електронного коду та податкового року, які разом розглядаються як унікальні


0

це легко

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

та дані dt2 містять унікальні дані колонки1, стовпця2..колонкуNth.


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

Привіт @ GálGyula, Ласкаво просимо до переповнення стека! Тут ми дбаємо про відповіді з хорошими поясненнями, а не просто кодом. Залиште відповідь, якщо вона справді вирішує питання, і ви можете пояснити, як це зробити. Щоб покращити ваші майбутні відповіді, перегляньте посібник, як написати гарну відповідь .
Ерік Петручеллі

-1

sthing як?

ВИБІРТЕ ДИСТИНКТ .... З таблиці, ЩО умова

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

примітка: Питання домашнього завдання? і бог благослови Google ...

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


3
кому хто не прихильнив мене: S ,, явно питання було змінено після моєї відповіді ?? (відповідь 10:15, питання відредаговано 12:15) о добре .. Thx для урського незнання :)
Madi D.

2
ОП запитує, як вибрати окремі рядки в середовищі C # ado.net, а не у фактичній базі даних.
аґгатон

-1
DataTable dtbs = new DataTable(); 
DataView dvbs = new DataView(dt); 
dvbs.RowFilter = "ColumnName='Filtervalue'"; 
dtbs = dvbs.ToTable();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.