【问题标题】:How flatten a list with many arrays inside using LINQ如何使用 LINQ 展平包含许多数组的列表
【发布时间】:2015-03-19 06:21:36
【问题描述】:

我发现这很难理解以及从哪里开始,所以我希望有人能够指出正确的方向。我有一个列表(客户),其中有数组/列表。基本上我想将列表的所有结果扁平化为扁平版本。

public class Customer : EntityBase
{
    public Phonenumber[]      PhoneNumbers            { get; set; }
    public Contact            BillToContact           { get; set; }
    public Terms              Terms                    { get; set; }
 }

 public class Contact
 {
    public Phonenumber[]        PhoneNumbers     { get; set; }
    public Address              Address          { get; set; }
    public Key                  Key              { get; set; }
    public string               CompanyName      { get; set; }
    public string               Email            { get; set; }
    public string               FirstName        { get; set; }
}

public class Phonenumber
{
    public string               Number            { get; set; }
    public int                  Key               { get; set; }
}

public class Terms
{
    public int      DueDays                       { get; set; }
    public int      DiscountDays                  { get; set; }
}


public class Address
{
    public string               Address1                    { get; set; }
    public string               Address2                    { get; set; }
    public string               City                        { get; set; }
    public string               Country                     { get; set; }
}

public abstract class EntityBase
{
    public Guid   Id          { get; set; }
    public string Status      { get; set; }
    public int    Rev         { get; set; }
} 

我尝试了很多方法,但越来越困惑。因此,如果有人可以帮助我,甚至指出正确的方向,我将不胜感激。以下是我尝试过的方法之一。

public IEnumerable<Customer> Find (Func<Customer , bool> predicate) {

     foreach (var p in Customer.SelectMany(p => p)) {
             if(predicate(p)) {
             yield return p;
          }
       }
     }

我正在将一个 jason 字符串反序列化为一个列表,然后想在数据网格中显示,但 igGrid 不支持绑定到嵌套(复杂)属性。所以我需要展平列表,以便列表没有子级别。

【问题讨论】:

  • 您想要什么的列表?
  • 您的意见是什么?你已经有一个单位IEnumerable&lt;Customer&gt;,你要拼什么?
  • 您是否要获取所有客户的所有电话号码列表?这是我看到的唯一数组。
  • 我有一个 List,其中例如是电话号码,所以对于那个例子,我有很多电话号码,我希望它们位于第一级。
  • 您可以这样做,但您的问题是,如果目标是一个对象,那么该对象的每个实例都会有不同的结构。听起来很乱。如果您解释了您要通过这样做来完成什么,这可能会有所帮助。你介意吗?

标签: c# linq list flatten


【解决方案1】:

您的问题根本不清楚您真正想要什么输出。您只想要所有电话号码的列表吗?或者您想保留其他Customer 信息,以便获得Customer 信息的多个实例,每个实例都有一个单独的电话号码?

您可以通过以下方式完成前者:

IEnumerable<Phonenumber> numbers =
    customers.SelectMany(
        customer => customer.PhoneNumbers
                            .Concat(BillToContact.PhoneNumbers));

如果您只想要 Customer.PhoneNumbers 数字而不是 BillToContact 对象中的数字,只需将 .Concat(BillToContact.PhoneNumbers) 排除在上述之外。

如果您想保留原始 Customer 对象中的一个或多个值,您可以执行以下操作:

var numbers = customers.SelectMany(
    customer => customer.PhoneNumbers.Select(
        number => new
        {
            Number = number, 
            FirstName = customer.BillToContact.FirstName,
            Email = customer.BillToContact.Email
        }));

上面将生成匿名类型对象的枚举,每个对象都有一个电话号码,以及来自关联Contact 对象的相应FirstNameEmail 值。您当然可以混合搭配(例如,使用 .Concat(...) 包含来自 BillToContact 对象的电话号码),并包含您想要的任何特定的 CustomerContact 成员。

【讨论】:

    【解决方案2】:

    要从List&lt;Customer&gt; 中选择PhoneNumber 的数组,请使用SelectMany

    List<Customer> customers = [data];
    PhoneNumber phoneNumbers = customers.SelectMany(x=>x.PhoneNumbers).ToArray();
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 2016-11-29
      • 2016-03-16
      • 2017-11-13
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多