C# - 如何转换Lazy <list <t>&gt;到Lazy <list <u>&gt;?</list <u> </list <t>

时间:2011-02-22 17:03:41

标签: c# list lazy-loading type-conversion

我有一个Lazy<List<T>>,其中T是一个类,它有一个巨大的字符串和有关文件的元数据。 我们称之为Property HugeString和Property Metadata

我有这个类U,它具有相同的属性HugeString等等。我必须将Lazy<List<T>>转换为Lazy<List<U>>而不加载所有内容。

有可能吗?

这是我创建列表的地方,在该方法中我获取有关文件和文件本身的信息:

entity.VersionedItems =
    new Lazy<List<VersionedItemEntity>>(
        () => VersionedItemEntity.GetFromTFSChanges(entity,chng.Changes));

这就是我想做的事(评论)

ChangesetList.Add(
    new HistoryLogEntryModel()
    {
        Revision = changeset.Changeset.ToString(),
        Author = changeset.User,
        Date = changeset.Date.ToString("dd/MM/yyyy"),
        Message = changeset.Comment,
        //VersionedItems = changeset.VersionedItems
    }

但是HistoryLogEntryModel具有不同版本的VersionedItems。我需要转换一些变量。如果我将一个东西转换成另一个东西,它会加载所有东西,这将是不必要的和缓慢的。

这是正确的做法吗?我怎么能实现这个目标呢?

谢谢你。

2 个答案:

答案 0 :(得分:4)

您应该能够将Lazy<List<T>>打包在Lazy<List<U>>

var uLazy = new Lazy<List<U>>(() => tLazy.Value.Select(t => (U)t).ToList());

答案 1 :(得分:0)

或者使用某种扩展方法:

public static class ExtensionMethods
{
    public static Lazy<U> Convert<T,U>(this Lazy<T> source, Func<Lazy<T>, Lazy<U>> convert)
    {
        return convert(source);
    }
}

Lazy<List<int>> source = new Lazy<List<int>>();

Lazy<List<string>> converted = source.Convert(x => 
{ 
 return new Lazy<List<string>>()
            {
                Items = x.Items.ConvertAll<string>(i => i.ToString())
            };
});

我确信这样做有一个更整洁的方法。