#c# #list
#c# #Список
Вопрос:
Я хочу добавить некоторый диапазон элементов в свою инициализацию списка, но иногда я не хочу добавлять элемент на основе условия, я пробовал ниже с помощью троичного оператора, но он добавляет null в мой список. Есть ли способ, которым я могу полностью пропустить добавление определенного элемента, если условие выполнено? Я могу сделать это без использования инициализации в отдельном блоке if, но я ищу решение, которое можно выполнить в том же операторе инициализации. Чтобы быть более понятным с моей проблемой, мой список должен иметь разный порядок элементов на основе флага
var myListByOrder= new List<Object>();
if(flag)
{
MyListByOrder.AddRange( new []
{
item1,
item2,
condition ? item3: null,
item 4,
item 5
});
}
else
{
MyListByOrder.AddRange( new []
{
item5,
item3,
condition? item7 :null
item 1,
item 2
});
}
Теперь только из-за условия, которое я не хочу нарушать читаемость кода и предоставлять дополнительные if-else, есть ли решение для этого, которое может сохранить это то же самое и пропустить элементы, если условие выполнено. Другой способ заключается в том, что я могу удалить нули из массива после их заполнения указанным выше способом.
Комментарии:
1. Вы не инициализируете список, вы добавляете элементы массива в уже существующий список. Синтаксис инициализации коллекции аналогичен синтаксису массива, например
var MyList=new List<item>{ item1, item2}
. Откуда берутся эти элементы? Было бы проще изменить этот код и просто не создавать то, что не нужно.2. итак, откуда берутся эти элементы? Этот вопрос является неполным. Если они создаются итератором, вы можете пропустить ненужные элементы. Если они создаются запросом, вы можете использовать
Where
. Вы могли бы даже использовать простойcondition ? new[]{i1,i2,i3}: new []{i1,i2}
. Илиcondition ? new List<I>{i1,i2,i3}: new List<I>{i1,i2}
Ответ №1:
Если этот шаблон часто встречается в вашем коде, вы могли бы рассмотреть возможность создания пары методов расширения, которые можно использовать для построения цепочки методов для добавления элементов в a List<T>
.
Что-то вроде этого:
public static class ListExtensions
{
public static List<T> Append<T>(this List<T> list, params T[] values)
{
list.AddRange(values);
return list;
}
public static List<T> AppendIf<T>(this List<T> list, bool condition, params T[] values)
{
return condition ? list.Append(values) : list;
}
}
А затем создайте список таким образом:
myListByOrder
.Append(item1, item2)
.AppendIf(condition, item3)
.Append(item4, item5);
Ответ №2:
Нет, инициализаторы массива должны иметь фиксированную длину, известную во время компиляции.
Но есть много альтернатив, как я уверен, вы знаете. Если вы все равно добавляете элементы в список, вы также можете добавить их в отдельные инструкции.