Ответ 1
Вам нужно сделать это,
void Yourfunction(List<DateTime> dates )
{
}
Я взял список и ввел в него какое-то значение
public List<DateTime> dates = new List<DateTime>();
DateTime dt1 = DateTime.Parse(12/1/2012);
DateTime dt2 = DateTime.Parse(12/6/2012);
if (dt1 <= dt2)
{
for (DateTime dt = dt1; dt <= dt2; dt = dt.AddDays(1))
{
dates.Add(dt);
}
}
Теперь я хочу передать этот список i.e датам в качестве параметра для некоторой функции, например -
somefunction(dates);
Как именно я могу достичь этого?
Вам нужно сделать это,
void Yourfunction(List<DateTime> dates )
{
}
public void SomeMethod(List<DateTime> dates)
{
// do something
}
Вы всегда должны избегать использования List<T>
в качестве параметра. Не только потому, что этот шаблон уменьшает возможности вызывающей стороны сохранять данные в другом виде сбора, но также и вызывающая сторона должна сначала преобразовать данные в List
.
Преобразование IEnumerable
в List
стоит O (n) сложности, что абсолютно не нужно. И это также создает новый объект.
TL; DR вы всегда должны использовать правильный интерфейс, такой как IEnumerable
или IQueryable
зависимости от того, что вы хотите сделать со своей коллекцией. ;)
В твоем случае:
public void foo(IEnumerable<DateTime> dateTimes)
{
}
Вы можете передать его как List<DateTime>
public void somefunction(List<DateTime> dates)
{
}
Однако лучше использовать наиболее общий (как обычно, базовый) интерфейс, поэтому я бы использовал
public void somefunction(IEnumerable<DateTime> dates)
{
}
или
public void somefunction(ICollection<DateTime> dates)
{
}
Вы также можете вызвать .AsReadOnly()
, прежде чем передавать список методу, если вы не хотите, чтобы метод изменял список - добавляйте или удаляйте элементы.
Мне это нужно для Unity в С#, поэтому я подумал, что это может быть полезно для кого-то. Это пример передачи списка AudioSources любой функции, которую вы хотите:
private void ChooseClip(GameObject audioSourceGameObject , List<AudioClip> sources) {
audioSourceGameObject.GetComponent<AudioSource> ().clip = sources [0];
}