如何用LINQ查询列表中含指定整数出现n次的TestObj对象
解决方案
没问题,这事儿其实挺容易搞定的,咱们用LINQ的FirstOrDefault配合计数逻辑就能实现你要的效果——找到第一个Ints列表里指定整数x恰好出现n次的TestObj,没有符合条件的就返回null。
基础实现代码
先贴出完整的可运行代码示例,方便你直接参考:
// 你的TestObj类定义 public class TestObj { public List<int> Ints; } // 假设你已经有了目标集合ListOfTestObjs,以及要匹配的x和n值 int targetX = 3; // 你要找的整数 int targetCount = 2; // 要求的出现次数 TestObj matchedObj = ListOfTestObjs.FirstOrDefault(obj => obj.Ints != null && obj.Ints.Count(num => num == targetX) == targetCount);
关键细节说明
FirstOrDefault本身就完美契合你的需求:它会返回第一个满足条件的对象,如果没有任何符合条件的元素,自动返回null(因为TestObj是引用类型)。- 我们加了
obj.Ints != null的判断,避免当某个TestObj的Ints字段为null时,调用Count方法触发空引用异常。 - 如果你想把
Ints为null的情况当作“出现0次”(比如当targetCount=0时,要匹配这类对象),可以把判断逻辑改成这样:
这里用了C#的空传播运算符TestObj matchedObj = ListOfTestObjs.FirstOrDefault(obj => (obj.Ints?.Count(num => num == targetX) ?? 0) == targetCount);?.和空合并运算符??,如果Ints是null,就会用0来代替计数结果,再和目标次数比较。
性能优化小技巧
如果你的Ints列表特别大,反复调用Count可能会有点性能开销。这种情况下,可以先把每个对象的计数提前算好,再筛选:
var matchedObj = ListOfTestObjs .Select(obj => new { Obj = obj, XCount = obj.Ints?.Count(num => num == targetX) ?? 0 }) .FirstOrDefault(item => item.XCount == targetCount)?.Obj;
这样每个Ints列表只会被遍历计数一次,效率会更高一些。
内容的提问来源于stack exchange,提问作者Mike Hawkins
相关产品推荐
相关产品推荐

