查找下一个编号的项目符号词

Find next Numbered Bullet Word

假设我们有以下列表。

  1. item1
  2. 列表项
  3. 列表项
  4. 列表项
  5. 列表项

我有项目符号 3 的范围,我想使用 C# 找到它的下一个项目符号。 需要这方面的帮助。

private Range ListParaRangeNext(Range range)
    {

        Range forparas = range.Duplicate;
        ListParagraphs paras = null;
        if (range.ListFormat.List != null)
        {

            paras = range.ListFormat.List.ListParagraphs;
            //MessageBox.Show(paras.Count.ToString());
        }
        else
        {
            forparas.SetRange(range.Start, range.StoryLength - 1);
            paras = forparas.ListParagraphs;
        }
        List<Paragraph> ienum = paras.Cast<Paragraph>().ToList();


        //ienum = (from para in ienum
        //         where para.Range.ListFormat.ListLevelNumber == range.ListFormat.ListLevelNumber
        //            && para.Range.End > range.Start
        //         select para).ToList();



        List<Paragraph> temp = new List<Paragraph>();
        for (int i = 0, length = ienum.Count; i < length; ++i)
        {
            if (ienum[i].Range.ListFormat.ListLevelNumber == range.ListFormat.ListLevelNumber && ienum[i].Range.End > range.Start)
                temp.Add(ienum[i]);
        }
        ienum = temp;
        ienum = ienum.OrderBy(o => o.Range.Start).ToList();

        if (ienum.Count > 1)
        {
            Range current = ienum[1].Range;
            if (current.ListFormat.ListValue - 1 == range.ListFormat.ListValue)
            {
                return current;
            }
        }
        return null;
    }

我正在使用这个函数来查找,但它占用了我程序的大部分时间。 有什么优化建议吗?

如果您有字符串列表 - 找到一些成员并获取它的索引。下一项的索引将增加 1。

var index = lists.IndexOf(lists.FirstOrDefault(x => x == "222"));
 var next = lists[index + 1];

您的列表是段落/范围的集合

跳转到您使用的下一个项目符号 Range.Next Unit:=wdParagraph

对于“线性列表”没问题,但是如果列表中散布着“普通”段落,您将需要检查ListFormat 属性 将帮助您确定它是否是列表项

[编辑]

这是获取范围对象的示例代码

In VSTO

Range rng = Globals.ThisAddIn.Application.Selection.Range;
Range new_rng = rng.Next(WdUnits.wdParagraph);

In VBA

Dim rng As Range
Set rng = Selection.Range
Dim new_rng As Range
Set new_rng = rng.Next wdParagraph

我没有测试,但它应该可以工作