Найти строку в таблице данных с определенным идентификатором

У меня есть два столбца в datatable:

ID, Calls. 

Как узнать, какое значение Calls равно where ID = 5?

5 может быть любым числом, это просто для примера. Каждая строка имеет уникальный идентификатор.


person RSM    schedule 17.12.2013    source источник
comment
Не могли бы вы сделать это как часть оператора select? ВЫБЕРИТЕ ID, Звонки ИЗ MyTable WHERE ID=@id_search. Затем просто укажите параметр @id_search для вызова базы данных. Это будет быстрее, чем LINQ, особенно при условии, что ID является первичным ключом или проиндексирован.   -  person drew_w    schedule 17.12.2013
comment
Боюсь, это не база данных, а набор данных/таблица данных.   -  person RSM    schedule 17.12.2013


Ответы (8)


Создайте строковые критерии для поиска, например:

string searchExpression = "ID = 5"

Затем используйте метод .Select() объекта DataTable, например:

DataRow[] foundRows = YourDataTable.Select(searchExpression);

Теперь вы можете просмотреть результаты, например:

int numberOfCalls;
bool result;
foreach(DataRow dr in foundRows)
{
    // Get value of Calls here
    result = Int32.TryParse(dr["Calls"], out numberOfCalls);

    // Optionally, you can check the result of the attempted try parse here
    // and do something if you wish
    if(result)
    {
        // Try parse to 32-bit integer worked

    }
    else
    {
        // Try parse to 32-bit integer failed

    }
}
person Karl Anderson    schedule 17.12.2013
comment
Это дает мне строку данных, но как мне получить конкретное значение из вызовов столбца - person RSM; 17.12.2013
comment
@RyanMurphy - обновленный ответ, чтобы показать, как получить значение из строки и безопасно попытаться проанализировать значение. - person Karl Anderson; 17.12.2013
comment
@RyanMurphy - нет проблем, не стесняйтесь также голосовать за ответ, если вы еще этого не сделали. :-) - person Karl Anderson; 17.12.2013
comment
Что, если я хочу получить номер строки для результата. как я могу это получить? - person Si8; 21.06.2018

Вы можете использовать LINQ для DataSet/DataTable

var rows = dt.AsEnumerable()
               .Where(r=> r.Field<int>("ID") == 5);

Поскольку каждая строка имеет уникальный идентификатор, вы должны использовать Single/SingleOrDefault, который вызовет исключение, если вы вернете несколько записей.

DataRow dr = dt.AsEnumerable()
               .SingleOrDefault(r=> r.Field<int>("ID") == 5);

(Замените int на тип поля вашего идентификатора)

person Habib    schedule 17.12.2013
comment
Некоторое время не удается выбрать строки из таблицы, используя этот DataRow[] foundRows = YourDataTable.Select(searchExpression);. Но когда я использую LINQ. Работает хорошо. Спасибо Хабиб. - person Karthikeyan P; 28.01.2016

Вы можете попробовать с выбором метода

DataRow[] rows = table.Select("ID = 7");
person marcello    schedule 18.09.2014

Я мог бы использовать следующий код. Всем спасибо.

int intID = 5;
DataTable Dt = MyFuctions.GetData();
Dt.PrimaryKey = new DataColumn[] { Dt.Columns["ID"] };
DataRow Drw = Dt.Rows.Find(intID);
if (Drw != null) Dt.Rows.Remove(Drw);
person Kamil KIZILTAŞ    schedule 16.03.2016

DataRow dataRow = dataTable.AsEnumerable().FirstOrDefault(r => Convert.ToInt32(r["ID"]) == 5);
if (dataRow != null)
{
    // code
}

Если это типизированный набор данных:

MyDatasetType.MyDataTableRow dataRow = dataSet.MyDataTable.FirstOrDefault(r => r.ID == 5);
if (dataRow != null)
{
    // code
}
person va.    schedule 17.12.2013

попробуйте этот код

DataRow foundRow = FinalDt.Rows.Find(Value);

но установить хотя бы один первичный ключ

person Tanmay Nehete    schedule 30.11.2015
comment
производительность должна быть операцией O(log n) на Ms docs: docs.microsoft.com/en-us/dotnet/api/ - person dier; 08.02.2019

Привет, просто создайте простую функцию, которая выглядит, как показано ниже. Она возвращает все строки, в которых введенный параметр вызова является допустимым или истинным.

 public  DataTable SearchRecords(string Col1, DataTable RecordDT_, int KeyWORD)
    {
        TempTable = RecordDT_;
        DataView DV = new DataView(TempTable);
        DV.RowFilter = string.Format(string.Format("Convert({0},'System.String')",Col1) + " LIKE '{0}'", KeyWORD);
        return DV.ToTable();
    }

и просто назовите его, как показано ниже;

  DataTable RowsFound=SearchRecords("IdColumn", OriginalTable,5);

где 5 - идентификатор. Спасибо..

person Sunday Efeh    schedule 21.12.2015

Старайтесь избегать ненужных циклов и используйте это, если это необходимо.

string SearchByColumn = "ColumnName=" + value;
DataRow[] hasRows = currentDataTable.Select(SearchByColumn);
if (hasRows.Length == 0)
{
    //your logic goes here
}
else
{
    //your logic goes here
}

Если вы хотите искать по определенному идентификатору, в таблице должен быть первичный ключ.

person Mohd Sadiq    schedule 07.10.2017