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
相关产品推荐
相关产品推荐

