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

C#中检查列表项IsOpen属性并格式化地址字段问题求助

问题排查与解决

针对你遇到的格式化操作未生效问题,按优先级排查以下几个核心点:

1. 检查InventoryItem的类型是struct还是class

如果InventoryItem是值类型(struct),Where(...).ToList()会创建一份独立的副本列表,你在foreach里修改的只是副本,原inventory.Inventory中的项不会有任何变化——这是C#和JavaScript的核心差异之一(JS对象均为引用类型)。

解决办法:

  • 最彻底的方式是将InventoryItem改为class(引用类型),这样修改的就是原对象:
public class InventoryItem // 替换原来的struct定义
{
    public bool IsOpen { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    // 其他属性
}
  • 若无法修改类型,需通过索引遍历原列表并替换对应项,避免操作副本。

2. 修正FormatAddress方法的逻辑

TextInfo.ToTitleCase仅会将小写字母开头的单词转为首字母大写,已经大写的单词不会处理(比如输入"123 MAIN STREET",输出仍为原内容)。如果需要强制统一格式,可先转成全小写再调用该方法:

private string FormatAddress(string address)
{
    if (string.IsNullOrWhiteSpace(address))
    {
        return "";
    }

    TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;
    // 先转小写再转标题格式,确保所有单词首字母大写
    string formattedAddress = textInfo.ToTitleCase(address.ToLower());
    return formattedAddress;
}

3. 确认是否存在IsOpen为true的项

可以添加调试输出验证代码是否进入了foreach循环:

var isOpenItems = inventory.Inventory.Where(i => i.IsOpen).ToList();
Console.WriteLine($"找到{isOpenItems.Count}个IsOpen为true的项"); // 调试用
if (isOpenItems.Any())
{
    foreach (var item in isOpenItems)
    {
        item.Address1 = FormatAddress(item.Address1);
        item.Address2 = FormatAddress(item.Address2);
    }
}

如果输出为0,说明没有符合条件的项,格式化逻辑自然不会执行。

简化代码的小建议

原代码中ToList()后再判断Any()属于冗余操作,空列表的foreach不会执行,可直接简化为:

foreach (var inventoryItem in inventory.Inventory.Where(i => i.IsOpen))
{
    inventoryItem.Address1 = FormatAddress(inventoryItem.Address1);
    inventoryItem.Address2 = FormatAddress(inventoryItem.Address2);
}

内容的提问来源于stack exchange,提问作者Jhig85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:18:20