Изменение Набора при использовании цикла foreach в c# [дубликат]

Ой, я просто отправил простофиля этого вопроса ...

ответ, существует не создано в функции как Oracle, Самая Большая , но можно достигнуть подобного результата для 2 столбцов с UDF, отметьте, использование sql_variant довольно важно здесь.

create table #t (a int, b int) 

insert #t
select 1,2 union all 
select 3,4 union all
select 5,2

-- option 1 - A case statement
select case when a > b then a else b end
from #t

-- option 2 - A union statement 
select a from #t where a >= b 
union all 
select b from #t where b > a 

-- option 3 - A udf
create function dbo.GREATEST
( 
    @a as sql_variant,
    @b as sql_variant
)
returns sql_variant
begin   
    declare @max sql_variant 
    if @a is null or @b is null return null
    if @b > @a return @b  
    return @a 
end


select dbo.GREATEST(a,b)
from #t

kristof

Отправил этот ответ:

create table #t (id int IDENTITY(1,1), a int, b int)
insert #t
select 1,2 union all
select 3,4 union all
select 5,2

select id, max(val)
from #t
    unpivot (val for col in (a, b)) as unpvt
group by id

8
задан MSalters 10 October 2013 в 08:39
поделиться

3 ответа

Вы не можете этого сделать. Из документации для IEnumerator :

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

Альтернативы:

  • Создайте новый список элементов для удаления, а затем удалите их все
  • Используйте обычный цикл «for» и убедитесь, что вы осторожны, чтобы не переступить через один и тот же элемент дважды или отсутствует. (Вы сказали, что не хотите этого делать, но то, что вы пытаетесь сделать, просто не сработает.)
  • Создайте новую коллекцию, содержащую только те элементы, которые вы хотите сохранить.

Последний из эти альтернативы представляют собой LINQ-подобное решение, где вы обычно пишете:

var newList = oldList.Where(x => ShouldBeRetained(x)).ToList();

(где ShouldBeRetained - это любая логика, которая вам нужна, конечно.) необходимо только в том случае, если вы действительно хотите, чтобы он был в списке. Это приводит к более декларативному коду, который часто легче читать. Я могу'

25
ответ дан 5 December 2019 в 05:19
поделиться

Вы должны знать, что в некоторых версиях Tomcat возникают утечки памяти при передислокации во время войны. Это случилось со мной на tomcat 6.0.x.

Как было предложено увеличить MaxPermSize , это временное решение для вашей машины разработки - и когда вы получите сообщение об ошибке, через 2-3 дня просто перезапустите сервер. На производстве не все так просто. Итак, этот работает для разработки , но этот подход не работает для производственной среды , где вы должны исправить проблемы с утечками памяти.

Чтобы обнаружить утечки, используйте Приложение jconsole , которое поставляется с jdk 1.6 и 1.5. Вы можете выполнить привязку к процессу и наблюдать за использованием памяти с течением времени.

Вы также можете прочитать это:

6
ответ дан 5 December 2019 в 05:19
поделиться

Вы определенно не можете каким-либо образом изменять коллекцию, используя для нее цикл foreach.

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

В обоих случаях это не так ясно и удобно :).

1
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

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