【问题标题】:Linq to return a new object with a selection from the listLinq 从列表中返回一个新对象
【发布时间】:2016-07-30 04:38:45
【问题描述】:

我有以下对象结构:

public class A
{
    public string ID { get; set; }
    public IList<B> Values { get; set; }
}

public class B
{
    public string Code { get; set; }
    public string DisplayName { get; set; }
}

public List<A> IDs;

我想使用 Linq 查询 B 并返回 A 的单个实例,其中包含 B 的单个元素。那可能吗?我目前使用 foreach 执行此操作,但我认为 Linq 会更整洁。

foreach (A a in IDs)
{
    foreach (B b in a.Values)
    {
        if (b.Code == code)
        {
            return (new A()
            {
                ID = a.ID,
                Values = new List<B>()
                {
                    new B()
                    {
                        Code = b.Code,
                        DisplayName = b.DisplayName
                     }
                 }
            });
        }
    }
}

【问题讨论】:

  • if (codeValue.Value == value) 中的codeValue 是什么?

标签: c# linq


【解决方案1】:

试试这个:

IDs.Where(a=>a.ID = id)
   .Select(a => new A() 
   {
       ID = a.ID,
       Values = new List<B>()
       {
           new B() 
           { 
               Code = a.Values.First().Code, 
               DisplayName = a.Values.First().DisplayName 
           }
       }
    });

【讨论】:

    【解决方案2】:

    在带有查询语法的 LINQ 中:

    return (from a in IDs
            from b in a.Values
            where b.Code == code
            select (new A
            {
                ID = a.ID, Values = new List<B>
                {
                    new B
                    {
                        Code = b.Code, 
                        DisplayName = b.DisplayName
                    }
                }
            })).FirstOrDefault();
    

    【讨论】:

      【解决方案3】:

      在 LinqPad (LinqPad.com) 中运行以下命令

      void Main()
      {
          List<A> IDs= new List<A>() {
              new A() { ID = "1", Values = new List<B>() {
                                   new B { Code = "1", DisplayName = "1"}, 
                                   new B { Code = "2", DisplayName = "2"},
                                   new B { Code = "3", DisplayName = "3"} } },
              new A() { ID = "4", Values = new List<B>() { 
                                   new B { Code = "4", DisplayName = "4"}, 
                                   new B { Code = "5", DisplayName = "5"},
                                   new B { Code = "6", DisplayName = "6"} } },
              new A() { ID = "7", Values = new List<B>() { 
                                   new B { Code = "7", DisplayName = "7"}, 
                                   new B { Code = "8", DisplayName = "8"},
                                   new B { Code = "9", DisplayName = "9"} } }
          };
      
          A result = IDs.Where(a => a.Values.Any(b=> b.Code == "4")).FirstOrDefault();
          result.Dump();
          result = IDs.FirstOrDefault(a => a.Values.Any(b=> b.Code == "8"));
          result.Dump();
      
      }
      
      // Define other methods and classes here
      public class A
      {
          public string ID { get; set; }
          public IList<B> Values { get; set; }
      }
      
      public class B
      {
          public string Code { get; set; }
          public string DisplayName { get; set; }
      }
      

      你明白了:


      之前的编辑如下:

      修改问题:

      A result = IDs.Where(a => a.Values.Any(b=> b.Code == code)).FirstOrDefault();
      

      原答案如下

      下面将返回ID = id的第一个A元素

      A result = IDs.Where(a => a.ID == id).FirstOrDefault();
      

      这使它成为一个列表

      List<A> result = IDs.Where(a => a.ID == id).FirstOrDefault().ToList();
      

      【讨论】:

      • 这使它成为一个列表 好吧,FirstOrDefault 看起来会返回一个bool,所以调用ToList 可能不会很好地工作。完全没有。我想你的意思是Where(a =&gt; a.ID == id)FirstOrDefault(a =&gt; a.ID == id) 可能更好。
      • @ta.speot.is -- FirstOrDefault 不返回布尔值,也不能将 lamda 作为参数。请参阅文档。 msdn.microsoft.com/en-us/library/bb340482.aspx - 关于在哪里的好点。
      • @Hogan FirstOrDefault 可以将 lambda 作为参数。请参阅文档。 msdn.microsoft.com/en-us/library/bb549039.aspx :-)
      • 您的原始代码是IDs.Select(a =&gt; a.ID == id)。这将获取IDs 中的每个项目并使用a.ID == id 对其进行评估,这将为每个项目返回一个bool。您现在有一个IEnumerable&lt;bool&gt;。调用 FirstOrDefault 将返回 ... bool
      • @ta.speot.is - 参见上面的代码,在 LinqPad 中似乎可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      相关资源
      最近更新 更多