代码之家  ›  专栏  ›  技术社区  ›  Julius Doan

通过查找/更好的方式获取子元素

  •  0
  • Julius Doan  · 技术社区  · 10 年前

    我正在尝试获取父元素的子元素。我有一个基本的数据库:

    public class list
    {
        public int id { get; set; }
        public List<Users> UsersList{ get; set; }
    
        public class Users
        {
            [Key]
            public int Users_id{ get; set; }
            public string UserId { get; set; }
        }
    }
    

    如果我想获取Users中具有特定UserId的所有元素,我该怎么做?我试图避免使用嵌套的for循环,并在数据库中遍历List和Users的所有条目。我正在查找LookUp(),但对于如何在本例中应用它有点困惑。任何帮助都会很棒!

    1 回复  |  直到 10 年前
        1
  •  1
  •   B.K.    10 年前

    既然你有点困惑,我将提供比我最初的答案更详细的信息。让我们使用您的代码,创建一个非常简单的示例程序:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    
    namespace SOSample
    {
        public class list
        {
            public int id { get; set; }
            public List<Users> UsersList { get; set; }
    
            public class Users
            {
                [Key]
                public int Users_id { get; set; }
                public string UserId { get; set; }
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                // Instantiate and initialize with sample data.
                var sampleList = new list()
                {
                    id = 12345,
                    UsersList = new List<list.Users>()
                    {
                        new list.Users() { Users_id = 1, UserId = "0042" },
                        new list.Users() { Users_id = 2, UserId = "0019" },
                        new list.Users() { Users_id = 3, UserId = "0036" },
                        new list.Users() { Users_id = 4, UserId = "0214" },
                        new list.Users() { Users_id = 5, UserId = "0042" },
                        new list.Users() { Users_id = 6, UserId = "0042" },
                        new list.Users() { Users_id = 7, UserId = "0019" }
                    }
                };
    
                // Linq search.
                var someId = "0042";
                var linqQuery = sampleList.UsersList.Where(user => user.UserId == someId);
    
                Console.WriteLine("Linq query results:");
                foreach (var r in linqQuery)
                {
                    Console.WriteLine($"Users_id: {r.Users_id}, UserId: {r.UserId}");
                }
    
                // Lookup search (using same someId as for Linq).
                var lookup = sampleList.UsersList.ToLookup(user => user.UserId);
                var lookupQuery = lookup[someId];
    
                Console.WriteLine("\nLookup query results:");
                foreach (var r in lookupQuery)
                {
                    Console.WriteLine($"Users_id: {r.Users_id}, UserId: {r.UserId}");
                }
            }
        }
    }
    

    输出:

    Linq query results:
    Users_id: 1, UserId: 0042
    Users_id: 5, UserId: 0042
    Users_id: 6, UserId: 0042
    
    Lookup query results:
    Users_id: 1, UserId: 0042
    Users_id: 5, UserId: 0042
    Users_id: 6, UserId: 0042
    

    希望能澄清问题。我看到您的问题和评论的主要问题是,您可能将嵌套类误认为是属性。当实例化外部类时,内部类不会被实例化,它不是外部类的某种属性。

    旧答案(提供个人详细信息):

    我喜欢使用Linq。所以,假设 sampleList 属于类型 list :

    var query = sampleList.UsersList.Where(user => user.UserId == someId);
    

    这会给你 IEnumerable<list.Users> 。您可以随时使用 ToList() , ToArray() , ToDictionary() 要获得所需的集合类型:

    var results = sampleList.UsersList.Where(user => user.UserId == someId).ToArray();
    

    远至 Lookup ,我见过几种使用方法,但我最熟悉的方法是:

    var lookup = sampleList.UsersList.ToLookup(user => user.UserId);
    var query = lookup[someId];
    

    再一次,这会给你 IEnumerable<列表。用户> 。或者,您可以从该查询中获取您选择的集合类型:

    var results = lookup[someId].ToArray();
    

    基本上,您指定了键在该查找中表示的内容(它是 UserId 在这种情况下),然后当时间到来时,您按一个键进行搜索。