XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using XFEEDToolBox.Core.Engineering;

namespace XFEEDToolBox.Core.Planning;

/// <summary>Tracks materials that needed collecting, so later restocking can mark them complete.</summary>
public sealed class MaterialChecklist
{
    private readonly HashSet<string> included = new(StringComparer.OrdinalIgnoreCase);
    public IReadOnlyList<string> Keys => included.Order(StringComparer.OrdinalIgnoreCase).ToArray();
    public void Clear() => included.Clear();
    public void Restore(IEnumerable<string> keys)
    {
        included.Clear();
        foreach (var key in keys.Where(key => !string.IsNullOrWhiteSpace(key))) included.Add(key.Trim());
    }
    public IReadOnlyList<MaterialNeed> Update(IReadOnlyList<MaterialNeed> aggregatedNeeds)
    {
        var needed = aggregatedNeeds.Where(material => material.Required > 0).ToArray();
        included.IntersectWith(needed.Select(material => material.Key));
        foreach (var material in needed.Where(material => material.Missing > 0)) included.Add(material.Key);
        return needed.Where(material => included.Contains(material.Key)).OrderBy(material => material.Missing == 0).ThenByDescending(material => material.Missing).ToArray();
    }
}