【问题标题】:Select from one dictionary with a second dictionary从一个字典和第二个字典中选择
【发布时间】:2019-01-06 22:51:35
【问题描述】:

我有 2 个字典 List<Dictionary<string, object>> 像这样:

[{"Id":"2","FirstName":null,"MiddleName":null,"LastName":null,"Birthday":null,"Username":null,"Password":null,"LastLogin":null,"CreateDateTime":null,"UpdateDateTime":null,"Blocked":null,"HasOrders":null}]

并且有一个像这样的字典Dictionary<string, string> 用于过滤

var dict = new Dictionary<string, object>
        {
            { "Username", "myUsername" },
            { "Password", "myPassword" }
        };

我的问题是如何在第二个列表的帮助下过滤掉第一个列表中的记录。 请注意,我需要在第二个列表中包含 2 或 3 个动态键/值的 where 语句。这些 JSON 结构中有很多记录。

如果有人能指出正确的方向,那就太好了。

--更新--

我想要的东西,但比没有 foreach:

 foreach(Dictionary<string, object> v in Data)
                                {
                                    v.Where(x => 
 x.Key.Contains(nList.Where(n => n.Key == x.Key && n.Value = x.Value)));
                                }

我不知道如何在 LINQ 中执行此操作

【问题讨论】:

  • This 帖子将回答您的问题。使用 Linq where 子句。
  • “如何在第二个列表的帮助下过滤掉第一个列表中的记录”?如果您在过滤器完成后指定您期望的结果会更清楚。
  • 如果你能提供一个minimal reproducible example 带有样本输入和基于这些样本输入的预期结果,那就太棒了。
  • 如果用户在此字典中存在,我需要通过用户名和密码进行过滤
  • 正如@mjwills 已经提到的。 提供一个包含样本输入和预期结果的最小、完整和可验证的示例。

标签: c# linq dictionary


【解决方案1】:

我建议您分几步执行此操作。第一步,显然是将 List> 结构转换为 List。将其作为字典集合处理不是一个好方法。

    public class UserPass
    {
        public string Username{get;set;}
        public string Password{get;set;}
    }

    public class User
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public DateTime? Birthday { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public DateTime? LastLogin { get; set; }
        public DateTime? CreateDateTime { get; set; }
        public DateTime? UpdateDateTime { get; set; }
        public bool? Blocked { get; set; }
        public bool? HasOrders { get; set; }
    }

例如,

var dictionary1 = new Dictionary<string,object>()
    {
        ["Id"]="2",
        ["FirstName"]=null,
        ["MiddleName"]=null,
        ["LastName"]=null,
        ["Birthday"]=null,
        ["Username"]="anuviswan",
        ["Password"]="password",
        ["LastLogin"]=null,
        ["CreateDateTime"]=null,
        ["UpdateDateTime"]=null,
        ["Blocked"]=null,
        ["HasOrders"]=null
    };

    var dictionary2 = new Dictionary<string,object>()
    {
        ["Id"]="3",
        ["FirstName"]=null,
        ["MiddleName"]=null,
        ["LastName"]=null,
        ["Birthday"]=null,
        ["Username"]="user1",
        ["Password"]=null,
        ["LastLogin"]=null,
        ["CreateDateTime"]=null,
        ["UpdateDateTime"]=null,
        ["Blocked"]=null,
        ["HasOrders"]=null
    };

    var dataList= new List<Dictionary<string,object>>
    {
        dictionary1,dictionary2
    };

    var dict1 = new Dictionary<string, object>
        {
            { "Username", "myUsername" },
            { "Password", "myPassword" }
        };

    var dict2 = new Dictionary<string, object>
        {
            { "Username", "anuviswan" },
            { "Password", "password" }
        };

    var filterList = new List<Dictionary<string,object>> {dict1, dict2};

    var dataObjectList = dataList.Select(x=> new User
    {
        Id = Convert.ToInt32(x[nameof(User.Id)]),
        Username = Convert.ToString(x[nameof(User.Username)]),
        Password = Convert.ToString(x[nameof(User.Password)]),
    });

    var filterObjectList = filterList.Select(x=>
    new UserPass
    {
        Username = Convert.ToString(x[nameof(UserPass.Username)]),
        Password = Convert.ToString(x[nameof(UserPass.Password)]),
    });

有了新的列表,您可以查询为

var result =dataObjectList.Join(filterObjectList, 
                           d=>d.Username, 
                           f=>f.Username,
                           (x,y)=> new 
                              {
                                Data = x, 
                                Filter=y
                              })
                          .Where(x=>x.Data.Username.Equals(x.Filter.Username) 
                             && x.Data.Password.Equals(x.Filter.Password))
                         .Select(x=>x.Data);;

【讨论】:

  • 问题是我在 Dictionairy 中获取了这些数据,已经尝试将其推送到动态类中,并在运行时使用生成的类,但也没有真正起作用。除了过滤器参数一直在变化,所以我不能使用静态名称。这是一个不错的方法,如果我可以将 Dictionary 推送到动态对象中,它会起作用
  • 当您说过滤器参数发生变化时,会不会出现没有用户名密码的情况?这永远不会发生,对吧?
  • 是的,它可以,我正在寻找一种解决方案,我可以将过滤器数据继承为类似 Data.Select(x => x.Where(foreach n in filter { key = value })) .我知道这是不可能的,但我正在寻找这个方向。我什至不确定这是否可能是我想要的,但是我知道这些过滤器应该很快,因为其中一些查询将通过第 1000 条记录
  • 我刚刚找到了一些可以解决问题的方法。 msdn.microsoft.com/en-us/vstudio/bb894665.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多