查找下一个编号的项目符号词
Find next Numbered Bullet Word
假设我们有以下列表。
- item1
- 列表项
- 列表项
- 列表项
- 列表项
我有项目符号 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
我没有测试,但它应该可以工作
假设我们有以下列表。
- item1
- 列表项
- 列表项
- 列表项
- 列表项
我有项目符号 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
我没有测试,但它应该可以工作