C#根据条件从IReadOnlyCollection获取N个结果

时间:2019-02-19 09:12:22

标签: c# generics

所以我有返回IReadOnlyCollection<object>的函数

IReadOnlyCollection<object> calc = GetAll();

在此calc中,我有string, object的词典,因此当我想基于某些value搜索某些Key时:

foreach (var item in calc)
{
    Dictionary<string, object> t= (Dictionary<string, object>)item;
    var id = t.First(x => x.Key == "MyKey").Value.ToString();    
}

但是我进入了foreach循环。

是否有没有任何Loop的情况? (例如,如果我想获得N个结果)?

2 个答案:

答案 0 :(得分:2)

如果要获取calc中所有词典中“ MyKey”条目的所有值,可以这样做:

var ids = calc.OfType<Dictionary<string,object>>()             // get all dictionaries
              .SelectMany(d => d.Where(x => x.Key == "MyKey")) // get all KeyValuePairs with a key "MyKey"
              .Select(x => x.Value.ToString())                 // get the values as string
              .ToList();                                       // make it a list

这将产生一个List<string>

如果只需要N个结果,请使用Take()

var ids = calc.OfType<Dictionary<string,object>>()             // get all dictionaries
              .SelectMany(d => d.Where(x => x.Key == "MyKey")) // get all KeyValuePairs with a key "MyKey"
              .Select(x => x.Value.ToString())                 // get the values as string
              .Take(N)                                         // take only first N values
              .ToList();                                       // make it a list

答案 1 :(得分:0)

您可以为此使用 linq 扩展方法,使用 Where()过滤元素,然后使用 Take()前N个过滤。{{ 3}}是MSDN文章。顺便说一句,不需要选择第一个键,字典始终只有一个键,您可以将最后一行重写为 var id = t["MyKey"].ToString();