C# - 如何将Lazy<List<T>>转换为Lazy<List<U>>?

5
我有一个Lazy<List<T>>,其中T是一个具有大量字符串和文件元数据的类。让我们称它们为属性HugeString和属性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个回答

4

您应该能够将Lazy<List<T>>包装在Lazy<List<U>>中。

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

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())
            };
});

我相信有更简洁的方法来完成这个任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接