如何实现获取含最高非重复Score的MyObj对象?
实现获取含最高唯一分数的MyObj方法
现有C#类定义
public class MyObj { public string Id { get; set; } public List<MyOtherObj> OtherObject { get; set; } public class MyOtherObj { public int Score { get; set; } } }
待实现方法
public MyObj GetHighestScoreThatIsNotDuplicated(IEnumerable<MyObj> myObjs) { //待实现逻辑 return new MyObj(); }
需求说明
- 输入示例1:MyObj1(Id=1,Score列表:5,4,3,2,1)、MyObj2(Id=2,Score列表:10,5,4,3,2),应返回MyObj2,因其包含最高的非重复Score值10。
- 输入示例2:MyObj1(Id=1,Score列表:5,4,3,1)、MyObj2(Id=2,Score列表:5,4,3,2,1)、MyObj3(Id=3,Score列表:5,4,3,1),应返回MyObj2,因其包含唯一的Score值2。
实现方案
不需要递归,用LINQ就能写出简洁高效的逻辑,核心步骤如下:
- 统计所有分数的出现频次;
- 筛选出仅出现一次的分数,找到其中最高的那个;
- 定位到包含该最高唯一分数的MyObj对象。
完整实现代码:
public MyObj GetHighestScoreThatIsNotDuplicated(IEnumerable<MyObj> myObjs) { // 收集所有分数并统计出现次数 var scoreCounts = myObjs .SelectMany(obj => obj.OtherObject?.Select(o => o.Score) ?? Enumerable.Empty<int>()) .GroupBy(score => score) .ToDictionary(group => group.Key, group => group.Count()); // 找到最高的唯一分数 var highestUniqueScore = scoreCounts .Where(kv => kv.Value == 1) .OrderByDescending(kv => kv.Key) .Select(kv => kv.Key) .FirstOrDefault(); // 返回包含该分数的MyObj,无符合条件时返回null return myObjs.FirstOrDefault(obj => obj.OtherObject?.Any(o => o.Score == highestUniqueScore) == true); }
补充说明
- 代码中加入了空引用保护,避免因
OtherObject为null引发异常; - 如果不存在任何唯一分数,方法会返回
null,可根据实际需求调整返回逻辑(比如返回默认实例或抛出异常)。
内容的提问来源于stack exchange,提问作者Paul Evans
相关产品推荐
相关产品推荐

