【问题标题】:Create a list of one object type from a list of another using Linq使用 Linq 从另一个对象类型的列表创建一个对象类型的列表
【发布时间】:2009-11-09 00:34:58
【问题描述】:

如果我有 A 类和 B 类:

public class A
{
    public int TotalCount;
    public string Title;
}

public class B
{
    public int Count;
    public string Title;
}

我有一个实例列表 A 实例,使用 Linq 创建和填充类型 B 列表的最有效方法是什么?

【问题讨论】:

  • 你的问题不清楚……A和B是什么关系?
  • 本质上它们代表的是同一件事。在我的实际情况下,A是我创建一个Linq to Sql类并向其添加表时由Linq to Sql生成的一个类。因为 A 类具有 Linq 和 Linq to Sql 依赖项,我不想将它暴露给我的应用程序,所以我创建了没有依赖项的 B 类。所以我需要从 A 类实例列表中填充 B 类实例列表。

标签: linq linq-to-objects


【解决方案1】:
List<B> listB = listA.Select(a => new B()
   {
        Count = a.TotalCount,
        Title = a.Title
   }).ToList();

与 eduncan 的解决方案相同,但语法不同。任君挑选..

【讨论】:

  • 有没有办法从 listA 中过滤值,这样 listB 就不需要在 listA 中包含所有项目?
  • @user20358 是的,LINQ 有一个 Where 函数。在 ToList() 之前,您可以这样调用: .Where(w=> w.TotalCount > 5) 然后调用 .ToList();
【解决方案2】:
var list = 
  from a in TableA
  select new B {
    Count = a.TotalCount,
    Title = a.Title
  };

您在 select 子句中新建一个 B 实例,并使用 C# 3.0 中的内联属性分配功能分配属性。

内联映射的优势在于延迟执行 Linq 语句。 Linq 将映射修改后的语句,并从您的 IQueryable 中执行它。例如:

public class ClassA 
{
  public int TotalCount;    
  public string Title;
}

public class ClassB
{
  public int Count;
  public string Title;
}

public IQueryable<ClassB> FetchAllOfClassB()
{
  var list = 
    from a in TableOfClassA
    select new ClassB {
      Count = a.TotalCount,
      Title = a.Title
    };

  return list.AsQueryable();
}

从技术上讲,AsQueryable() 有点多余。有时我用它来说明一点,其他人说这是绝对必要的。尽管如此,列表对象本身是 ClassB 的 IQueryable。

然后你可以调用FetchAllOfClassB() 更进一步的链,并使用 IQuerable。它非常流畅且高效。

【讨论】:

  • 刚要写这样的东西,但你已经掌握了! +1
  • 谢谢各位。也提高了你的 cmets。 :)
【解决方案3】:

嗯,我的头上(所以可能会有错误!):

List&lt; B &gt; = from a in listOfA select new B(a.count, a.title);

可能会成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2023-03-14
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多