По моему мнению, реализация каждой вещи самостоятельно - не всегда лучший подход.
Что касается меня, я бы сделал 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<>();
}
ForEach не изменяем, он не изменяет структуру данных всегда.
Вы можете также:
Пример № 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();
То, что Вы возможно хотите:
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
, таким образом, мы можем выполнить обновления, который делает это менее широко применимым.