You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:03:26