4

我有一个清单List<string> Rank

列表 Rank 中的项目是

"FF"
"ABC"
"CC"
"FF"
"FF"

我想要一个 linq 查询,如果存在则返回值及其计数,假设如果我搜索“FF”,那么它应该返回

value: ff
count: 3

目前我正在使用此查询来查找匹配项

var match = Rank.FirstOrDefault(s => s.Contains("FF"));

并且此查询对相同的值进行分组并为其分配计数。

var f = Rank.GroupBy(x => x).Select(g => new { Value = g.Key, Count = g.Count() });

我试过这个,但它返回给我完整的列表,它看起来像 where 子句不是

var f = Rank.GroupBy(x => x).Select(g => new { Value = g.Key, Count = g.Count() }).Where(s => Rank.Contains("FF"));

谁能知道为什么第三个查询不起作用?

4

3 回答 3

6

这几乎是正确的

var f = Rank.GroupBy(x => x)
            .Select(g => new { Value = g.Key, Count = g.Count() })
            .Where(s => Rank.Contains("FF"));

只需将结尾更改为,以便查询新创建的匿名对象

var f = Rank.GroupBy(x => x)
            .Select(g => new { Value = g.Key, Count = g.Count() })
            .Where(s => s.Value == "FF");
于 2013-11-12T07:28:40.203 回答
4

尝试这个

var matchCount = Rank.Count(x=>x.Contains("FF"));

它将返回列表中包含“FF”的字符串计数,如果您不知道是否有任何项目与您的谓词匹配,请执行以下操作:

if(Rank.Any(x=>x.Contains("FF"))
{
   ...
}
于 2013-11-12T07:27:47.887 回答
0
var list = new List<string>
               {
                   "FF", "ABC", "CC", "FF", "FF"
               };
string search = "FF";

var result = list.GroupBy(l => l).Where(g => g.Key.Contains(search)).Select(s => new Tuple<string, int>(s.Key, s.Count())).FirstOrDefault();
于 2013-11-12T07:33:55.640 回答