Как выбрать отдельные строки в таблице данных и сохранить в массиве


169

У меня есть набор данных objds. objds содержит таблицу с именем Table1. Таблица1 содержит столбец с именем ProcessName. Это ProcessName содержит повторяющиеся имена. Так что я хочу выбрать только разные имена. Это возможно.

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

Отправьте пример кода из комментария, который вы сделали ниже, и, похоже, ответ зависит от специфики запроса, с которым вы работаете.
МэтьюМартен

Ответы:


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


если у меня есть 2 столбца «mo» и «name», мне нужно получить отдельное «mo», но не «name», но мне нужно сохранить столбец «name» в моей таблице данных, что мне делать?
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свойство а 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: возможно, выберите new {col1 = dRow ["col1"], col2 = dRow ["col2"], ...}) .Distinct (); правильнее?
Урик

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

Первая строка работает. Во-вторых, как указывает Урик, это не так, но урик также не работает, так как Distinct () не найдет равенства при сравнении объектов на анонимных типах.
Алан Бальеу

9

Чтобы улучшить ответ выше: функция ToTable в dataview имеет «отличный» флаг.

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

1
Это не похоже на работу. Существует только одна перегрузка с отдельным логическим параметром, и для нее требуется массив параметров. Я думаю, что это просто вернет таблицу с именем «True» без применения DISTINCT.
Proudgeekdad

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

Я предполагаю, что OP искал отличное при использовании DataTable.Select (). (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 };

Фильтрует таблицу данных с помощью eecode и taxyear, которые в совокупности рассматриваются как уникальные.


0

Это просто

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

и dt2 datatable содержит уникальные данные column1, Column2..ColumnNth.


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

Привет @ GálGyula, добро пожаловать в переполнение стека! Здесь мы заботимся об ответах с хорошими объяснениями, а не только о коде. Отправляйте ответ только в том случае, если он действительно решает вопрос, и вы можете объяснить, как это сделать. Чтобы улучшить ваши будущие ответы, посмотрите руководство, как мне написать хороший ответ .
Эрик Петручелли

-1

что-то вроде?

ВЫБЕРИТЕ DISTINCT .... ИЗ таблицы ГДЕ условие

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

примечание: домашнее задание? и бог благословит Google ..

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


3
чтобы кто меня отверг: S ,, очевидно, вопрос был изменен после моего ответа ?? (ответ 10:15, вопрос отредактирован 12:15) да ладно ... спасибо за невежество :)
Мади Д.

2
OP спрашивает, как выбрать отдельные строки в среде C # ado.net, а не в реальной базе данных.
Аггатон

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.