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

C#:能否用ForEach替换Acrobat SDK的while循环?字段迭代无序

用foreach/IEnumerable替换Acrobat SDK的while循环并解决遍历顺序问题

替换while循环为foreach

当然可以直接用foreach遍历IFields,因为IFields接口本身实现了IEnumerable,编译器会自动处理枚举器的创建、移动和资源清理,代码比手动写while循环简洁很多:

IAFormApp formApp = new AFormAppClass();    
IFields myFields = (IFields)formApp.Fields;

foreach (IField myField in myFields)
{
    // 在这里处理每个字段的逻辑
}

如果想结合LINQ做更多操作,也可以先把IFields转成强类型枚举:

var fieldEnumerable = myFields.Cast<IField>();
// 后续可直接用LINQ的过滤、映射等方法
foreach (var field in fieldEnumerable)
{
    // 处理字段
}

解决遍历顺序混乱的问题

Acrobat SDK默认的字段枚举顺序是PDF内部的存储顺序,和表单的视觉布局、制表切换顺序完全无关。要按预期顺序遍历,最可靠的方式是收集所有字段后,根据TabIndex(制表顺序)排序——这个属性对应用户按Tab键切换字段的顺序,基本和表单视觉布局一致:

IAFormApp formApp = new AFormAppClass();    
IFields myFields = (IFields)formApp.Fields;

// 先把所有字段收集到列表
var allFields = new List<IField>();
using (var enumerator = myFields.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        allFields.Add((IField)enumerator.Current);
    }
}

// 按TabIndex升序排序,得到预期顺序
allFields.Sort((fieldA, fieldB) => fieldA.TabIndex.CompareTo(fieldB.TabIndex));

// 遍历排序后的字段
foreach (IField myField in allFields)
{
    // 处理字段逻辑
}

如果表单未设置TabIndex,也可以尝试根据字段Name属性排序,不过TabIndex是最贴合用户感知的顺序依据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:15:37