【问题标题】:C# - How to convert Lazy<List<T>> to Lazy<List<U>>?C# - 如何将 Lazy<List<T>> 转换为 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。而且我需要转换一些变量。如果我将一件事转换为另一件事,它会加载所有内容,这将是不必要且缓慢的。

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

谢谢你的建议。

~

【问题讨论】:

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


    【解决方案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())
                  };
      });
      

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

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 2019-05-20
        • 2019-02-03
        相关资源
        最近更新 更多