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

Posted

技术标签:

【中文标题】C# - 如何将 Lazy<List<T>> 转换为 Lazy<List<U>>?【英文标题】:C# - How to convert Lazy<List<T>> to Lazy<List<U>>? 【发布时间】:2011-07-02 03:59:20 【问题描述】:

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

我有这个 U 类,它具有相同的属性HugeString 等等。我必须在不加载所有内容的情况下将Lazy&lt;List&lt;T&gt;&gt; 转换为Lazy&lt;List&lt;U&gt;&gt;

有可能吗?

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

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。而且我需要转换一些变量。如果我将一件事转换为另一件事,它会加载所有内容,这将是不必要且缓慢的。

这是正确的方法吗?我还能如何做到这一点?

谢谢你的建议。

~

【问题讨论】:

【参考方案1】:

您应该能够将Lazy&lt;List&lt;T&gt;&gt; 包装在Lazy&lt;List&lt;U&gt;&gt; 中。

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

【讨论】:

【参考方案2】:

或者使用某种扩展方法:

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

我确信有一种更简洁的方法可以做到这一点。

【讨论】:

以上是关于C# - 如何将 Lazy<List<T>> 转换为 Lazy<List<U>>?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将 List<DataRow> 转换为 List<T>?

C# 泛型重载 List<T> :这将如何完成?

如何将 List<> 数组中的数据保存到文本文件(C#)?

如何将 C# List<string[]> 转换为 Javascript 数组?

如何将 C# 中的 Dictionary <string,List<string>> 转换为带有键作为标题的 csv?

Lazy<T>的应用之类内部字段与C#延迟加载