从过滤的自定义List <t>转换为LINQ </t>

时间:2009-10-12 01:46:17

标签: c# .net linq generics lambda

我有一个自定义列表,它继承自Generic.List<T>,如下所示:

public class TransferFileList<T> : List<TransferFile> { .. }

当我设置(“Files”为TransferFileList<T>)时:

var files = uploadResponse.Files.Where(x => !x.Success).ToList()

files”对象解析为System.Collections.Generic.List<TransferFile>,而不是TransferFileList<T>,这正是我所期望的,因为它是通过Where过滤的,所以如何我可以成功将TransferFileList<T>列表返回到'文件'吗?

我确实尝试过:

var files = uploadResponse.Files.Where(x => !x.Success).ToList() 
as TransferFileList<TransferFile>;

但是使用该安全转换,它只是解析为null。

谢谢你们和gals。

3 个答案:

答案 0 :(得分:2)

首先,我要问你为什么要继承List<T>? 99%的时间都是个坏主意。

如果要扩展列表的功能,请使用扩展方法:

public static something PrintErrors(this List<TransferFile> list)
{
    //do your printing logic
}

回答:ToList()IEnumerable<T>进行操作,并将序列成员转换为相同类型的List。由于你继承了实现List<T>的{​​{1}},那就是那里发生的事情。

IEnumerable<T>的工作方式相同 - 在Where()上操作并返回IEnumerable<T>

要获得一些类似于任意列表的对象,您需要将序列中的项目添加到自定义列表中,如下所示:

IEnumerable<T>

答案 1 :(得分:1)

您可以为IEnumerable<TransferFile&gt;添加扩展方法处理这种情况:

public static TransferFileList ToTransferFileList(
    this IEnumerable<TransferFile> files)
{
    return new TransferFileList(files);
}

// ...

var files = uploadResponse.Files.Where(x => !x.Success).ToTransferFileList(); 

这为您提供了TransferFileList,而不仅仅是List<TransferFile>。请注意as返回null的原因是因为虽然TransferFileListList<TransferFile>,但同样不能保持另一个方向。也就是说,您的List<TransferFile>不是TransferFileList对象。

我同意@RexM,由于存在大量的陷阱,因此可以避免任何子类化List<T>的尝试。我建议使用Composition(Has-A而不是Is-A)或者坚持使用基类库集合。

答案 2 :(得分:0)

谢谢你们。

我喜欢SLV的扩展方法,但还有其他直接投射方法吗?

如果不是,我可能会采用恢复的在线方法,我希望避免:

var transferFiles = new TransferFileList<TransferFile>();
if (files != null) 
  transferFiles.AddRange(files);