Используя условные операторы лямбды с foreach Действием со списком

По моему мнению, реализация каждой вещи самостоятельно - не всегда лучший подход.

Что касается меня, я бы сделал HashMap<Integer, ArrayList<MusicV3>>, который будет хранить год для списка песен.

Так будет выглядеть окончательный код.

HashMap<Integer, ArrayList<MusicV3>> songs = new HashMap<>();

void addSong(MusicV3 song) {
    ArrayList<MusicV3> list = songs.get(song.year);

    if (list == null) {
        list = new ArrayList<>();
        songs.put(song.year, list);
    }

    list.add(song);
}

ArrayList<MusicV3> findSongsByYear(int year) {
    ArrayList<MusicV3> list = songs.get(year);
    if (list != null)
        return list;
    else
        return new ArrayList<>();
}
5
задан Alex 24 March 2009 в 10:57
поделиться

2 ответа

ForEach не изменяем, он не изменяет структуру данных всегда.

Вы можете также:

  1. Обработайте цикл сами с индексом
  2. Произведите новый список, с помощью.Select и.ToList (если Вы используете.NET 3.5),

Пример № 1:

for (Int32 index = 0; index < myList.Count; index++)
    if (myList[index].Trim().Length == 0)
        myList[index] = "0.0";

С.NET 3.5 и Linq:

myList = (from a in myList
          select (a.Trim().Length == 0) ? "0.0" : a).ToList();

С.NET 3.5, не используя Linq-синтаксис, но с помощью Linq-кода:

myList = myList.Select(a => (a.Trim().Length == 0) ? "0.0" : a).ToList();

Править: Если Вы хотите произвести новый список, удваивается, можно также сделать это сразу использование Linq:

List<Double> myDoubleList =
    (from a in myList
     select (a.Trim().Length == 0 ? "0" : a) into d
     select Double.Parse(d)).ToList();

Обратите внимание, что использование "0.0" вместо всего "0" полагается на десятичную точку, являющуюся символом точки. В моей системе это не, таким образом, я заменил его всего "0", но более соответствующий путь будет состоять в том, чтобы изменить вызов для Удвоения. Синтаксический анализ для взятия явного числового форматирования, как это:

List<Double> myDoubleList =
    (from a in myList
     select (a.Trim().Length == 0 ? "0.0" : a) into d
     select Double.Parse(d, CultureInfo.InvariantCulture)).ToList();
6
ответ дан 13 December 2019 в 22:16
поделиться

То, что Вы возможно хотите:

public static void MutateEach(this IList<T> list, Func<T, T> mutator)
{
    int count = list.Count;
    for (int n = 0; n < count; n++)
        list[n] = mutator(list[n]);
}

Который позволил бы:

myList.MutateEach(a => (a.Trim().Length == 0) ? "0.0" : a);

Просто поместите MutateEach метод в общедоступном статическом собственном классе и удостоверяется, что у Вас есть директива использования, которая найдет его.

Стоит ли определить что-то вроде этого, зависит от того, как часто Вы использовали бы его. Обратите внимание, что это должно быть расширение на IList вместо IEnumerable, таким образом, мы можем выполнить обновления, который делает это менее широко применимым.

4
ответ дан 13 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

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