2016-01-14 4 views
1

Я прокручиваю массив datarows и когда конкретный случайный элемент недействителен, я хочу удалить этот элемент и получить новое общее количество, чтобы получить другой случайный элемент. Но когда я удаляю datarow, datarow не уходит ... И да, возможно, есть намного лучший способ сделать это, но я недостаточно умен, чтобы это сделать.Как удалить datarow из массива datarow?

Вместо того, чтобы удалять строку, я вижу это внутри

ItemArray = podLps[1].ItemArray бросил исключение типа System.Data.RowNotInTableException

//PHASE 1: Get all LPs in the pod and add to collection 
List<DataRow> allLps = dtLp.AsEnumerable().ToList(); 
DataRow[] podLps = allLps.Where(x => x.ItemArray[0].ToString() == loPod).ToArray(); 

//PHASE 2: Pick a random LP from collection that has valid WAVE1 
for (int i = podLps.Count(); i > 0; i--) 
{ 
    //Recount items in collection since one may have been removed 
    int randomIndex = random.Next(podLps.Count()); 
    var randomLpUserId = podLps[randomIndex].ItemArray[1].ToString(); 
    var randomLpWave1 = int.Parse(podLps[randomIndex].ItemArray[2].ToString()); 

    //Get WAVE1 # for selected LP 
    lpNumberOfLoans = GetNumberOfLoans(session, randomLpUserId); 

    //check if LP has valid WAVE1 then use this person 
    if (randomLpWave1 > lpNumberOfLoans) 
    { 
     return randomLpUserId; 
    } 
    else 
    { 
     podLps[randomIndex].Delete(); 
    } 
} 
+0

DataTable allLps = dtLp.AsEnumerable(). Где (х => x.ItemArray [0] .ToString() == loPod) .CopyToDataTable(); – jdweng

+0

@punkouter, работающий с DataTable в моем примере ниже, обратит внимание на то, как я назначаю «переменную строки», это работает – MethodMan

ответ

3

взгляд на этот пример, и он должен направить вас в правильном направлении для удаления строк я просто проверял и он работает

for (int i = myDataTable.Rows.Count - 1; i >= 0; i--) 
{ 
    DataRow row = myDataTable.Rows[i]; //Remove 
    if (myDataTable.Rows[i][0].ToString() == string.Empty) 
    { 
     myDataTable.Rows.Remove(row); 
    } 
} 
+0

Хорошо. Я думаю, что мое замешательство проистекает из того, что Datarow не связан с оригинальным datatable. Поэтому, возможно, лучший способ - каким-то образом перебрать через datatable вместо этого ... Или поместить все это в список – punkouter

+0

, это работает, попробуйте просто удалить строки с помощью datatable – MethodMan

+0

Мне нравится этот ответ лучше всего, поскольку, если вы конвертируете его в список, массив будет менее эффективным, чем просто оставить данные в DataTable и работать с ним там. –

0

Самый простой способ для преобразования массива DataRow[] в списке, вызовите RemoveAt, а затем преобразовать список обратно в массив:

var dest = new List<>(podLps); 
dest.RemoveAt(randomIndex); 
podLps = dest.ToArray(); 
+1

DataRow [] не содержит определения RemoveAt – punkouter

+0

Обновлено мой ответ – Jaco

0

Я бы предложил использовать Список для podLps вместо массива. Тогда вы можете использовать .RemoveAt как упоминал Jaco (не работает для массивов).

DataRow.Delete() просто помещает строку, которая будет удалена в следующем обновлении вашего DataTable.

+0

Возможно, вы правы. Возможно, попытка манипулировать списком будет проще. – punkouter

Смежные вопросы