【问题标题】:Search in list of expandoObject在 expandoObject 列表中搜索
【发布时间】:2015-03-02 21:14:32
【问题描述】:

假设我有一个 List 的动态对象,例如:

var records = [
  {
    "Id": 1,
    "Name": "sai",
    "Age": "4",
    "About": "12.02.1991"
  },
{
    "Id": 2,
    "Name": "hjfh",
    "Age": "2",
    "About": "12.02.1991"
  },
{
    "Id": 3,
    "Name": "hello name",
    "Age": "6",
    "About": "hi"
  },
{
    "Id": 4,
    "Name": 1,
    "Age": "9",
    "About": "hello world"
  }
]

string searchString = "Hello";

我试过类似的东西:

foreach (var item in records )
{

    foreach (var field in item)
    {
        if (field.Value != null && field.Value.ToString().IndexOf(query.SearchString, StringComparison.OrdinalIgnoreCase) >= 0) 
        {
            count++;
            break;
        }
    }
}

我想要记录的任何字段中具有searchString 的记录数。但是我可以使用LINQ 查询来写这个吗?

【问题讨论】:

    标签: c# linq list search dynamic


    【解决方案1】:

    应该是这样的: 逻辑:

    var qry = records.Where(x=>x.Field.Contains(searchedstring)).Count();
    

    真实例子:

    var qry = records.Where(x=>x.Name.Contains("sai")).Count();
    

    【讨论】:

    • 它很可能是一个包含而不是==。考虑到它是一个搜索的事实。
    • 感谢您的回答@Maciej Los 我想在每条记录的每个字段中进行搜索
    【解决方案2】:

    这是您的代码,已转换为 linq 表达式:
    您可以访问 select 语句中的字段和对象。

        records.Cast<ExpandoObject>().SelectMany(x => x, (obj, field) => new { obj, field })
            .Where(x => x.field.Value != null && x.field.Value.ToString().IndexOf(SearchString, StringComparison.OrdinalIgnoreCase) >= 0)
            .Select(x => x.field.Key);
    

    统计至少有一个字段包含搜索字符串的对象数量:

        records.Cast<ExpandoObject>()
            .Where(x => x.Any(y => y.Value != null && y.Value.ToString().IndexOf(SearchString, StringComparison.OrdinalIgnoreCase) >= 0))
            .Count();
    

    【讨论】:

    • 感谢@codemonkey 它返回包含搜索字符串的字段数,但我不希望在任何地方都有搜索字符串的记录,如果搜索字符串存在于单个记录中的 2 个或多个位置,它应该只计算一次
    【解决方案3】:

    下面是最简单的代码。

    int count = records.Count(x => x.Name.StartsWith("hello") || x.About.StartsWith("hello"));
    

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 2021-05-15
      • 1970-01-01
      • 2014-02-14
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 2018-07-30
      相关资源
      最近更新 更多