Проблемы с удалением элементов из списка при переборе списка

Ваша проблема в том, что вам нужно объединить статические части сообщения с динамическими частями с помощью оператора +:

var highTemps = ["32", "41", "36", "29", "39", "37", "40"];
var lowTemps = ["18", "24", "20", "27", "30", "31", "27"];

var d = new Date();
var n = d.getDay();

if(n == 0){
  alert("Expect a high of " + highTemps[0] + " and a low of " + lowTemps[0] + " today.");
}else if(n == 1){
  alert ("Expect a high of" + highTemps[1] + "and a low of" + lowTemps[1] + "today.");
}else if(n == 2){
  alert("Expect a high of" + highTemps[2] + "and a low of" + lowTemps[2] + "today.");
}else if(n == 3){
  alert("Expect a high of" + highTemps[3] + "and a low of" + lowTemps[3] + "today.");
}else if(n == 4){
  alert("Expect a high of" + highTemps[4] + "and a low of" + lowTemps[4] + "today.");
}else if(n == 5){
  alert("Expect a high of" + highTemps[5] + "and a low of" + lowTemps[5] + "today.");
}else if(n == 6){
  alert("Expect a high of" + highTemps[6] + "and a low of" + lowTemps[6] + "today.");
}else {
  alert("Who knows what the temperature is?!");
};

console.log("The average temperature for this week is [average].");
console.log("The warmest day of the week will have a high temperature of [hTemperature]");
console.log("The lowest low temperature of the week will be [lTemperature].)");
[ 1111]

Теперь, сказав это, мы можем упростить ваш код, просто используя переменную n в качестве индекса для массивов и избавившись от всего этого if/then.

Кроме того, с типом if / затем у вас есть выражение switch, которое может быть более кратким:

var highTemps = ["32", "41", "36", "29", "39", "37", "40"];
var lowTemps = ["18", "24", "20", "27", "30", "31", "27"];

var d = new Date();
var n = d.getDay();

// If the array contains an index of the current day number
if(highTemps.indexOf(n) > -1){
  // Just extract that element from the arrays and use it.
  alert("Expect a high of " + highTemps[n] + " and a low of " + lowTemps[n] + " today.");
} else {
  // Otherwise, show the default message
  alert("Who knows what the temperature is?!");
}

console.log("The average temperature for this week is [average].");
console.log("The warmest day of the week will have a high temperature of [hTemperature]");
console.log("The lowest low temperature of the week will be [lTemperature].)");

16
задан 2 revs, 2 users 100% 23 August 2010 в 08:20
поделиться

7 ответов

При использовании List<T> метод ToArray() очень помогает в этом сценарии:

List<MyClass> items = new List<MyClass>();
foreach (MyClass item in items.ToArray())
{
    if (/* condition */) items.Remove(item);
}

Альтернативой является использование цикла for вместо foreach, но тогда вам нужно уменьшить переменную индекса всякий раз, когда вы удаляете элемент т.е.

List<MyClass> items = new List<MyClass>();
for (int i = 0; i < items.Count; i++)
{
    if (/* condition */)
    {
        items.RemoveAt(i);
        i--;
    }
}
16
ответ дан 30 November 2019 в 16:09
поделиться

Если ваш список является действительным List , вы можете использовать встроенный метод RemoveAll для удаления элементов на основе предиката:

int numberOfItemsRemoved = yourList.RemoveAll(x => ShouldThisItemBeDeleted(x));
14
ответ дан 30 November 2019 в 16:09
поделиться

Еще одна уловка - перебрать список в обратном направлении ... удаление элемента не повлияет ни на один из элементов, с которыми вы столкнетесь в оставшейся части цикла.

Я не рекомендую ни того, ни другого. Все, для чего вам это нужно, вероятно, можно сделать с помощью операторов LINQ для фильтрации списка по вашим требованиям.

2
ответ дан 30 November 2019 в 16:09
поделиться

Вы можете использовать целочисленное индексирование для удаления элементов:

List<int> xs = new List<int> { 1, 2, 3, 4 };
for (int i = 0; i < xs.Count; ++i)
{
    // Remove even numbers.
    if (xs[i] % 2 == 0)
    {
        xs.RemoveAt(i);
        --i;
    }
}

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

5
ответ дан 30 November 2019 в 16:09
поделиться

Причина ошибки в том, что вы используете цикл foreach. Если вы думаете о том, как работает цикл foreach, это имеет смысл. Цикл foreach вызывает метод GetEnumerator для списка. Если вы измените количество элементов в списке, перечислитель, который содержит цикл foreach, не будет иметь правильного количества элементов. Если вы удалили элемент, возникнет ошибка нулевого исключения, а если вы добавите элемент, цикл пропустит элемент.

Если вам нравятся выражения Linq и Lamda, я бы порекомендовал решение Дарина Димитрова, в противном случае я бы использовал решение, предоставленное Крисом Шмихом.

0
ответ дан 30 November 2019 в 16:09
поделиться

Вы можете использовать LINQ для замены исходного списка новым списком, отфильтровывая элементы:

IEnumerable<Foo> initialList = FetchList();
initialList = initialList.Where(x => SomeFilteringConditionOnElement(x));
// Now initialList will be filtered according to the condition
// The filtered elements will be subject to garbage collection

Таким образом, вам не нужно беспокоиться о циклах.

4
ответ дан 30 November 2019 в 16:09
поделиться

Рекомендуемое решение - поместить все элементы, которые вы хотите удалить, в отдельный список, а после первого цикла поместить второй цикл, в котором вы перебираете список удаления и удаляете эти элементы из формы. первый список.

1
ответ дан 30 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

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