2013-04-19 2 views
2

У меня есть список всех идентификаторов.Ошибка неявного преобразования в LINQ

// Код

List<IAddress> AllIDs = new List<IAddress>(); 
AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_")) 
       .Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_"))) 
       .ToList(); 

Я использую приведенный выше запрос LINQ, но получаю ошибку компиляции:

// Ошибка

Cannot implicitly convert type System.Collections.Generic.List to System.Collections.Generic.List

Я хочу, чтобы подстроки операции на поле члена AddressId на основе символа «_».

Где я ошибаюсь?

+5

Вы пытаетесь присвоить '' List в '' Список ... –

ответ

3

Вы находите адреса, которые вы хотите, с помощью этого места, но затем вы выбираете некоторые строки из идентификатора.

s.AddressId.Substring(s.AddressId.IndexOf("_")) is string 

т.е. Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_"))).ToList(); возвращает список подстрок

Просто удалите его и используйте

AllIDs= AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_")).ToList() 

в

Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_")) 

фильтрует список AllIDs, но держит их как IAddress s

, если переписать, как это вы должны быть в состоянии видеть, что проблема

Вы сказали

var items = from addr in AllIds 
      where addr.AddressId.Length >= addr.AddressId.IndexOf("_") // filter applied 
      select addr.AddressId.Substring(s.AddressId.IndexOf("_")); // select a string from the address 

AllIDs = items.ToList(); // hence the error List<string> can't be assigned to List<IAddress> 

но вы хотели

var items = from addr in AllIds 
      where addr.AddressId.Length >= addr.AddressId.IndexOf("_") // filter applied 
      select addr;      // select the address 

AllIDs = items.ToList(); // items contains IAddress's so this returns a List<IAddress> 
0

Ваш выбор операции .Select(s => s.AddressId.Substring(s.AddressId.IndexOf("_"))) не изменяет свои объекты, проецирует каждый объект подстроки. Таким образом, .ToList() возвращает List<string>.

1

Если вы хотите обновить AddressId с запросом Linq, вы можете сделать это следующим образом:

AllIDs.Where(s => s.AddressId.Length >= s.AddressId.IndexOf("_")) 
     .ToList() 
     .ForEach(s => s.AddressId = s.AddressId.Substring(s.AddressId.IndexOf("_"))); 

Обратите внимание, что .ForEach() не является расширение Linq, а метод класса List < T>.

С IndexOf может занять много времени, думать о кэшировании значение:

AllIDs.Select(s => new { Address = s, IndexOf_ = s.AddressId.IndexOf("_") }) 
     .Where(s => s.Address.AddressId.Length >= s.IndexOf_) 
     .ToList() 
     .ForEach(s => s.Address.AddressId = s.Address.AddressId.Substring(s.IndexOf_)); 
Смежные вопросы