Что не так я делаю в IEnumerable (C # 3.0) - PullRequest
0 голосов
/ 04 июня 2010

Если я напишу

var v = (from r in stock.ReplacementLog
                                             select new 
                                             {
                                                 AssetId = stock.AssetId,
                                                 Date = stock.ReferDate,
                                                 FactType = r.Key,
                                                 Value = r.Value
                                             });

Работает нормально ...

Но если я сделаю

IEnumerable<StockAsset> v = (from r in stock.ReplacementLog
 select new  {
 AssetId = stock.AssetId,
Date = stock.ReferDate,
FactType = r.Key,
Value = r.Value });

Я получаю ошибку:

Невозможно неявно преобразовать тип 'System.Collections.Generic.IEnumerable' в 'System.Collections.Generic.IEnumerable'. Существует явное преобразование (вам не хватает приведения?)

Тогда я сделал

IEnumerable<StockAsset> v = 
(
from r in stock.ReplacementLog
select new
{
AssetId = stock.AssetId,
Date = stock.ReferDate,
FactType = r.Key,
Value = r.Value
}).ToList<StockAsset>();

Со следующей связкой ошибок:

Ошибка 1 Аргумент экземпляра: невозможно преобразовать из 'System.Collections.Generic.IEnumerable' в 'System.Collections.Generic.IEnumerable'

Ошибка 2 'System.Collections.Generic.IEnumerable' не содержит определения для 'ToList' и наилучшей перегрузки метода расширения 'System.Linq.Enumerable.ToList (System.Collections.Generic.IEnumerable)' имеет несколько неверных аргументов

Тогда я попробовал с

IEnumerable<StockAsset> v1 = 
(from r in stock.ReplacementLog
select new StockAsset 
{
AssetId = stock.AssetId,
ReferDate= stock.ReferDate,
FactType = r.Key,
Value = r.Value
}); 

с ошибками: Ошибка 1 StockAsset не содержит определения для FactType

**Error 2
'StockAsset' does not contain a definition for Value'** 

Класс StockAsset соответствует

public class StockAsset
{
        public int AssetId { get; set; }
        public DateTime ReferDate {get;set;}        
        public Dictionary<EnumFactorType, double> ReplacementLog { get; set; }   
}

Нужна помощь.

Использование C # 3.0

Спасибо

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

Когда вы пишете

select new  {
 AssetId = stock.AssetId,
 Date = stock.ReferDate,
 FactType = r.Key,
 Value = r.Value }

Вы фактически генерируете анонимный тип. Вы не можете привести этот анонимный тип к объявленному типу.

Если вы хотите создать объект класса, вы должны сделать

 select new StockAsset
 {
     AssetId = ..., // Maybe stock.AssetId
     ReferDate = ..., // Maybe stock.ReferDate
     ReplacementLog = ... // Maybe new Dictionary<string, short> { {r.Key, r.Value} };
 }
0 голосов
/ 04 июня 2010

Я думаю, вы пытаетесь создать новый StockAsset для каждой записи в ReplaceLog другого StockAsset. Этот новый StockAsset будет иметь единственную запись в своем ReplacementLog. Это правильно? Если это так, вы можете создать новый конструктор в StockAsset:

public StockAsset(int assetId, DateTime referDate, 
                  EnumFactorType factorType, double value)
{
    AssetId = assetId;
    ReferDate = referDate;
    ReplacementLog = new Dictionary<EnumFactorType, double>();
    ReplacementLog[factorType] = value;
}

А затем вызовите этот конструктор внутри вашего LINQ.

IEnumerable<StockAsset> v = (from r in stock.ReplacementLog
    select new StockAsset(stock.AssetId, stock.ReferDate, r.Key, r.Value));
0 голосов
/ 04 июня 2010

Когда вы пишете

select new { property = value }

вы создаете экземпляр нового анонимного типа, в то время как похоже, что вы действительно хотите создавать StockAsset s, поэтому вы хотите

select new StockAsset { property = value }
...