Инициализация var в C # - PullRequest
2 голосов
/ 27 января 2009

Рассмотрим код ниже:

public IEnumerable <Country> ListPopulation()
{
    foreach(var continent in Continents)
    {
        var ids = context.continentTable
                   .where(y=>y.Name == continent.name)
                   .select(x=>x.countryId);

    }

    return GetPopulation(ids);// ids is not available here
}

Public IEnumerable<Country>GetPopulation(IQueryable<int> idnumbers)
{

}

Как я могу инициализировать var ids таким образом, чтобы я мог использовать его для вызова GetPopulation()?

Ответы [ 3 ]

5 голосов
/ 27 января 2009

Ну, главная проблема не имеет ничего общего с использованием "var". У вас есть цикл foreach с объявленной внутри переменной, а затем вы пытаетесь вернуться из вне цикла, используя эту переменную. Какое значение вы ожидаете получить?

Если вы пытаетесь выбрать все страны, почему бы вам просто не сделать это:

public IEnumerable <Country> ListPopulation()
{
    return GetPopulation(context.continentTable.Select(x => x.countryId));
}

Какой смысл перебирать каждый континент? Или есть страны в таблице continentTable, на которые не ссылается свойство Continents, которое вы не показали?

2 голосов
/ 27 января 2009

Вы, вероятно, должны следовать совету Джона Скита или Ника Берарди и просто сформулировать лучший запрос, но если у вас действительно есть веская причина для этого, вот ответ на ваш настоящий вопрос:

Чтобы получить доступ к переменной ids после выхода из области действия цикла, вы должны объявить ее снаружи. Но вы не можете использовать ключевое слово var , если не назначите переменную при объявлении. Таким образом, вы должны объявить тип явно:

public IEnumerable <Country> ListPopulation()
{
  IQueryable<Country> ids;
  foreach(var continent in Continents)
  {
    var ids = context.continentTable
              .Where(y=>y.Name == continent.Name)
              .Select(x=>x.countryId);
  }

  return GetPopulation(ids);
}
2 голосов
/ 27 января 2009

Я думаю, что вы используете LINQ неоптимальным образом

var ids = from c in context.continetTable
          select c.countryId

А затем посмотрите на основе этих идентификаторов, однако я не знаю вашу модель данных, но если ваш контент и таблица стран связаны, было бы легче сделать это.

public IEnumerable <Country> ListPopulation()
{
    return from c in context.contentTable
           select c.Country;
}

Если свойство Country - это свойство, основанное на значении CountryId.

...