Как изменить или удалить объекты из счетного набора при итерации через него в C#

Код не запускается / что-то похожее на части моего PHP-кода выводятся

Если вы не видите никакого результата из вашего кода PHP и / или видите части своего литерального исходного кода PHP на веб-странице вы можете быть уверены, что ваш PHP на самом деле не выполняется. Если вы используете View Source в своем браузере, вы, вероятно, видите весь исходный код PHP-файла. Поскольку PHP-код встроен в теги , браузер попытается интерпретировать их как HTML-теги, и результат может выглядеть несколько смущенным.

Чтобы на самом деле запустить ваши PHP-скрипты, вам нужно:

  • веб-сервер, который выполняет ваш скрипт
  • , чтобы установить расширение файла на .php, в противном случае веб-сервер не будет интерпретировать его как таковой *
  • для доступа ваш .php-файл через веб-сервер

* Если вы не переконфигурируете его, все может быть настроено.

Это последнее особенно важно. Двойной щелчок по файлу, скорее всего, откроет его в вашем браузере, используя такой адрес, как:

file://C:/path/to/my/file.php

Это полностью обходит любой веб-сервер, который у вас может быть запущен, и файл не интерпретируется. Вам нужно посетить URL-адрес файла на вашем веб-сервере, вероятно, что-то вроде:

http://localhost/my/file.php

Вы также можете проверить, используете ли вы короткие открытые теги вместо и ваша PHP-конфигурация отключила короткие открытые теги.

Также см. PHP-код не выполняется, вместо этого код отображается на странице

38
задан Robert Harvey 17 January 2012 в 15:42
поделиться

8 ответов

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

Смотрят на этот пример:

        var l = new List<int>();

        l.Add(0);
        l.Add(1);
        l.Add(2);
        l.Add(3);
        l.Add(4);
        l.Add(5);
        l.Add(6);

        for (int i = 0; i < l.Count; i++)
        {
            if (l[i] % 2 == 0)
            {
                l.RemoveAt(i);
                i--;
            }
        }

        foreach (var i in l)
        {
            Console.WriteLine(i);
        }
18
ответ дан bruno conde 27 November 2019 в 03:00
поделиться

Итерация Назад через Список походит на лучший подход, потому что, если Вы удаляете элемент и другие элементы, "попадают в разрыв", который не имеет значения, потому что Вы уже посмотрели на тех. Кроме того, Вы не должны волноваться о своей переменной счетчика, становящейся более крупными, чем.Count.

        List<int> test = new List<int>();
        test.Add(1);
        test.Add(2);
        test.Add(3);
        test.Add(4);
        test.Add(5);
        test.Add(6);
        test.Add(7);
        test.Add(8);
        for (int i = test.Count-1; i > -1; i--)
        {
            if(someCondition){
                test.RemoveAt(i);
            }
        }
88
ответ дан Michael Stum 27 November 2019 в 03:00
поделиться

Беря @bruno код, я сделал бы это назад.

, поскольку, когда Вы перемещаетесь назад, недостающие индексы массива не вмешиваются в порядок Вашего цикла.

var l = new List<int>(new int[] { 0, 1, 2, 3, 4, 5, 6 });

for (int i = l.Count - 1; i >= 0; i--)
    if (l[i] % 2 == 0)
        l.RemoveAt(i);

foreach (var i in l)
{
    Console.WriteLine(i);
}

, Но seriuosly, в эти дни, я использовал бы LINQ:

var l = new List<int>(new int[] { 0, 1, 2, 3, 4, 5, 6 });

l.RemoveAll(n => n % 2 == 0);
33
ответ дан chakrit 27 November 2019 в 03:00
поделиться

Так как Вы работаете с DataTable и должны быть в состоянии сохраниться, любой возвращается к серверу с адаптером таблицы (см. комментарии), вот пример того, как необходимо удалить строки:

DataTable dt;
// remove all rows where the last name starts with "B"
foreach (DataRow row in dt.Rows)
{
    if (row["LASTNAME"].ToString().StartsWith("B"))
    {
        // mark the row for deletion:
        row.Delete();
    }
}

Вызов удаляет на строках, изменит их свойство RowState на Удаленный, но покинет удаленные строки в таблице. Если все еще необходимо работать с этой таблицей, прежде чем сохранение возвратится к серверу (как то, если Вы хотите отобразить содержание таблицы минус удаленные строки), необходимо проверить RowState каждой строки, поскольку Вы выполняете итерации через него как это:

foreach (DataRow row in dt.Rows)
{
    if (row.RowState != DataRowState.Deleted)
    {
        // this row has not been deleted - go ahead and show it
    }
}

строки Удаления от набора (как в ответе bruno) повредят адаптер таблицы и не должны обычно делаться с DataTable.

5
ответ дан MusiGenesis 27 November 2019 в 03:00
поделиться

Некоторое время цикл обработал бы это:

int i = 0;
while(i < list.Count)
{
    if(<codition for removing element met>)
    {
        list.RemoveAt(i);
    }
    else
    {
        i++;
    }
}
3
ответ дан Andy Rose 27 November 2019 в 03:00
поделиться

решение chakrit может также использоваться при предназначении для.NET 2.0 (никакие выражения LINQ/lambda) при помощи делегата, а не лямбда-выражения:

public bool IsMatch(int item) {
    return (item % 3 == 1); // put whatever condition you want here
}
public void RemoveMatching() {
    List<int> x = new List<int>();
    x.RemoveAll(new Predicate<int>(IsMatch));
}
3
ответ дан 27 November 2019 в 03:00
поделиться

Удаление или добавление к списку, пока итерация через него может повредить его, как Вы сказали.

я часто использовал два подхода списка для решения проблемы:

ArrayList matches = new ArrayList();   //second list

for MyObject obj in my_list
{

    if (obj.property == value_i_care_about)
        matches.addLast(obj);
}

//now modify

for MyObject m in matches
{
    my_list.remove(m); //use second list to delete from first list
}

//finished.
2
ответ дан Philluminati 27 November 2019 в 03:00
поделиться

Когда я должен удалить объект из набора, который я перечисляю, я обычно перечисляю его наоборот.

0
ответ дан Adrian 27 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: