【问题标题】:dynamically define key name for which the value needs to be identified动态定义需要识别值的键名
【发布时间】:2019-04-14 23:31:51
【问题描述】:

我有一个类似这样的键值对列表

 List<Subscriptions> subs = new List<Subscriptions>();
subs.Add(new Subscriptions() { Id = 1, Name = "ABC" });
            subs.Add(new Subscriptions() { Id = 1, Name = "DEF" });

我可以搜索一个键(ID 或名称),但我想要实现的是用户定义他们想要搜索的键 ID 或名称

现在我正在使用这种方法根据名称值过滤列表

 var filtered = subs.Where(sub => sub.Name.IndexOf(SearchString.Text,StringComparison.OrdinalIgnoreCase) >=0);

sub.Name 在这里是静态定义的,我希望用户选择他们希望他们的搜索基于什么

例如,如果我们有 abc:Name 程序在 Name 键下搜索 abc,如果我们有 1:Id,那么它会在 ID 中搜索 1。 这只是一个示例,在实际场景中,我的列表中可以有多个字段。 我希望我能说清楚。

【问题讨论】:

    标签: c# list keyvaluepair


    【解决方案1】:

    为什么不通过简单的if elseswitch 应用Where

    // keyword : abc:Name or  1:Id
    var value = keyword.Split(':')[0];
    var key = keyword.Split(':')[1];
    
    if(key == "Name")
    {
        var filterred = subs.Where(sub => sub.Name == value);
    }
    else if(key == "Id")
        var filterred = subs.Where(sub => sub.id == int.Parse(value));
    }
    

    【讨论】:

    • 如果我只有两个字段,这是一个好方法,但是如果我有超过 2 个字段要搜索呢?那将是太多的代码行。我希望它是动态的
    • 通过开关,您可以添加许多您想要的字段。我认为您没有其他更简单的解决方案
    【解决方案2】:

    快速回答:

    string name = "";
    int? id = null;
    
    List<Subscriptions> subs = new List<Subscriptions>();
    
    var query = subs.AsQueryable();
    
    if (!string.IsNullOrEmpty(name))
        query = query.Where(p => p.Name == name);
    
    if (id.HasValue)
        query = query.Where(p => p.id == id.Value);
    
    var result = query.ToArray();
    

    详细回答:你可以阅读expression treeIQueryable interface

    如果您不使用 Entity Frmework 或 OData 之类的东西,基本上可以避免将您的列表转换为 IQueryable。但如果您需要将 LINQ 表达式转换为更复杂的表达式 - 您应该使用 IQueryable,或构建自己的表达式树。

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2011-09-08
      相关资源
      最近更新 更多