如何按Word对象属性分组排序并判断字母差值是否超出阈值(C#)
问题描述
我有三个类:Book类包含Page字典,Page字典中是Page类实例,Page类包含Word字典,其中存储Word类实例。Word类定义如下:
public class Word : IWord { public string Letter { get; set; } public ushort Number { get; set; } }
我需要对Word进行处理,判断单词中字母的跨度是否过大。项目中有一个同项目下的Optimisation方法,定义如下:
Optimisation( int differenceValue, string Letter ) { }
需求是:将不同Word.Letter对应的实例分组为列表或字典,排序后判断字母对应的数字差值是否超过给定的differenceValue,若超过则Optimisation方法返回false。例如单词“dog”,d对应4、o对应15、g对应7,当differenceValue为4时,15-4>4,方法返回false。我不知从何入手,考虑使用LINQ但不会操作,寻求实现方案。
实现方案
1. 从Book层级收集目标Word实例
首先需要从Book对象出发,遍历所有Page及其中的Word字典,筛选出指定Letter对应的所有Word实例:
// 假设book是你的Book类实例 var targetWords = book.Pages.Values .SelectMany(page => page.Words.Values) .Where(word => word.Letter == targetLetter);
2. 实现Optimisation方法逻辑
基于筛选出的Word实例,排序后计算数字的最大最小差值,与阈值对比后返回结果:
public bool Optimisation(int differenceValue, string targetLetter) { // 收集指定字母的所有Word实例 var targetWords = book.Pages.Values .SelectMany(page => page.Words.Values) .Where(word => word.Letter == targetLetter); // 无对应实例时,按需求返回true(可根据业务调整) if (!targetWords.Any()) return true; // 排序数字并计算跨度 var sortedNumbers = targetWords.Select(w => w.Number).OrderBy(n => n).ToList(); int span = sortedNumbers.Last() - sortedNumbers.First(); // 跨度超过阈值返回false,否则返回true return span <= differenceValue; }
3. 扩展:一次性检查所有字母的跨度
如果需要批量验证所有Letter的跨度是否符合要求,可以用以下逻辑:
public bool AllLettersMeetOptimisation(int differenceValue) { var letterGroups = book.Pages.Values .SelectMany(page => page.Words.Values) .GroupBy(word => word.Letter); foreach (var group in letterGroups) { var sortedNumbers = group.Select(w => w.Number).OrderBy(n => n).ToList(); int span = sortedNumbers.Last() - sortedNumbers.First(); if (span > differenceValue) return false; } return true; }
注意事项
- 处理空分组场景:当某个Letter没有对应的Word实例时,
Any()判断可以避免调用First()/Last()抛出异常。 - 如果Word字典的键本身就是Letter,可以直接通过
page.Words.TryGetValue(targetLetter, out var word)优化筛选效率,减少遍历开销。
内容的提问来源于stack exchange,提问作者Quack_boi
相关产品推荐
相关产品推荐

