Изменение элемента оценивает в методе <T>.ForEach ForEach Списка

Два трюка . В основном, инвертирование HTML-кода ваших желаемых элементов в HTML и использование ~ Оператора следующего сиблинга :

float-right + инвертирует порядок HTML элементы

div{ /* Do with the parent whatever you know just to make the
  inner float-right elements appear where desired */
  display:inline-block;
}
span{
  float:right;  /* float-right the elements! */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
  background:red;
} 
<div>
  <!-- Reverse the order of inner elements -->
  <span>5</span>
  <span>4</span>
  <span>3</span>
  <span>2</span>
  <span>1</span>
</div>


Родитель с direction: rtl; + инвертирует порядок внутренних элементов

.inverse{
  direction: rtl;
  display: inline-block; /* inline-block to keep parent at the left of window */
}
span:hover ~ span{ /* On hover target it's "previous";) elements */
  background:gold;
}
Hover one span and see the previous elements being targeted!<br>

<div class="inverse">
  <!-- Reverse the order of inner elements -->
  <span>5</span>
  <span>4</span>
  <span>3</span>
  <span>2</span>
  <span>1</span>
</div>

27
задан Jon 21 July 2009 в 18:07
поделиться

5 ответов

Предполагая, что раздел новостей является IEnumerable , вы хотите:

newsplit = newsplit.Select(x => "WW");

Текущий код эквивалентен следующему:

foreach(string x in newsplit.ToList()) {
    AssignmentAction(x);
}

...

public static void AssignmentAction(string x) {
    x = "WW";
}

Этот метод не изменяет x из-за семантики передачи по значению C # и неизменности строк.

38
ответ дан 28 November 2019 в 04:44
поделиться

Можно записать как это:

newsplit = newsplit.Select(x => "WW").ToList();
1
ответ дан 28 November 2019 в 04:44
поделиться

В других ответах объясняется, почему ваш текущий код не работает. Вот метод расширения, который исправит это:

// Must be in a static non-nested class
public static void ModifyEach<T>(this IList<T> source,
                                 Func<T,T> projection)
{
    for (int i = 0; i < source.Count; i++)
    {
        source[i] = projection(source[i]);
    }
}

Затем используйте вот так:

newsplit.ModifyEach(x => "WW");

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

Использование Select () - это конечно, более функциональный подход, но иногда стоит изменить существующую коллекцию ...

19
ответ дан 28 November 2019 в 04:44
поделиться

Это потому, что выражение LINQ создает Анонимные типы , и они доступны только для чтения. Их нельзя назначить. Кроме того, в стандарте для каждого цикла вы не можете назначить перечисляемую коллекцию. Попробуйте:

    foreach (var item in newsplit)
    {
        item = "this won't work";
    }
1
ответ дан 28 November 2019 в 04:44
поделиться

ForEach позволит вам манипулировать элементами IEnumerable, но не изменять ссылку на элемент.

т.е. это установит свойство Foo для каждый элемент в IEnumerable в строку «WW» :

newsplit.ToList().ForEach(x => x.Foo = "WW");

Однако вы не сможете изменять значения внутри самого IEnumerable.

3
ответ дан 28 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

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