Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
63ca8c23
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
63ca8c23
编写于
12月 09, 2015
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move to a builder pattern for creating a BKTree.
上级
fc65b4b2
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
81 addition
and
62 deletion
+81
-62
src/Workspaces/Core/Portable/Utilities/BKTree.Builder.cs
src/Workspaces/Core/Portable/Utilities/BKTree.Builder.cs
+78
-0
src/Workspaces/Core/Portable/Utilities/BKTree.cs
src/Workspaces/Core/Portable/Utilities/BKTree.cs
+2
-62
src/Workspaces/Core/Portable/Workspaces.csproj
src/Workspaces/Core/Portable/Workspaces.csproj
+1
-0
未找到文件。
src/Workspaces/Core/Portable/Utilities/BKTree.Builder.cs
0 → 100644
浏览文件 @
63ca8c23
using
System
;
using
System.Collections.Generic
;
using
System.Diagnostics
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
namespace
Roslyn.Utilities
{
internal
partial
class
BKTree
{
private
class
Builder
{
private
readonly
char
[][]
values
;
public
Builder
(
IEnumerable
<
string
>
values
)
{
this
.
values
=
values
.
Select
(
v
=>
v
.
ToLower
()).
Distinct
().
Select
(
v
=>
v
.
ToCharArray
()).
ToArray
();
}
internal
BKTree
Create
()
{
var
nodes
=
new
List
<
Node
>();
foreach
(
var
value
in
values
)
{
if
(
value
.
Length
>
0
)
{
Add
(
nodes
,
value
);
}
}
return
new
BKTree
(
nodes
.
ToArray
());
}
private
static
void
Add
(
List
<
Node
>
nodes
,
char
[]
lowerCaseCharacters
)
{
if
(
nodes
.
Count
==
0
)
{
nodes
.
Add
(
new
Node
(
lowerCaseCharacters
));
return
;
}
var
currentNodeIndex
=
0
;
while
(
true
)
{
var
currentNode
=
nodes
[
currentNodeIndex
];
var
editDistance
=
EditDistance
.
GetEditDistance
(
currentNode
.
LowerCaseCharacters
,
lowerCaseCharacters
);
// This shoudl never happen. We dedupe all items before proceeding to the 'Add' step.
Debug
.
Assert
(
editDistance
!=
0
);
if
(
currentNode
.
AllChildren
==
null
)
{
currentNode
.
AllChildren
=
new
Dictionary
<
int
,
int
>();
nodes
[
currentNodeIndex
]
=
currentNode
;
// Fall through. to actually add the child to this node.
}
else
{
int
childNodeIndex
;
if
(
currentNode
.
AllChildren
.
TryGetValue
(
editDistance
,
out
childNodeIndex
))
{
// Edit distances collide. Move to this child and add this word to it.
currentNodeIndex
=
childNodeIndex
;
continue
;
}
// Fall through. to actually add the child to this node.
}
currentNode
.
AllChildren
.
Add
(
editDistance
,
nodes
.
Count
);
nodes
.
Add
(
new
Node
(
lowerCaseCharacters
));
return
;
}
}
}
}
}
src/Workspaces/Core/Portable/Utilities/BKTree.cs
浏览文件 @
63ca8c23
...
...
@@ -10,7 +10,7 @@
namespace
Roslyn.Utilities
{
internal
class
BKTree
internal
partial
class
BKTree
{
// Root node is at index 0.
private
readonly
Node
[]
nodes
;
...
...
@@ -48,67 +48,7 @@ public static BKTree Create(params string[] values)
public
static
BKTree
Create
(
IEnumerable
<
string
>
values
)
{
return
Create
(
values
.
Select
(
v
=>
v
.
ToLower
()).
Distinct
().
Select
(
v
=>
v
.
ToCharArray
()).
ToArray
());
}
private
static
BKTree
Create
(
char
[][]
values
)
{
var
nodes
=
new
List
<
Node
>();
foreach
(
var
value
in
values
)
{
if
(
value
.
Length
>
0
)
{
Add
(
nodes
,
value
);
}
}
return
new
BKTree
(
nodes
.
ToArray
());
}
private
static
void
Add
(
List
<
Node
>
nodes
,
char
[]
lowerCaseCharacters
)
{
if
(
nodes
.
Count
==
0
)
{
nodes
.
Add
(
new
Node
(
lowerCaseCharacters
));
return
;
}
var
currentNodeIndex
=
0
;
while
(
true
)
{
var
currentNode
=
nodes
[
currentNodeIndex
];
var
editDistance
=
EditDistance
.
GetEditDistance
(
currentNode
.
LowerCaseCharacters
,
lowerCaseCharacters
);
if
(
editDistance
==
0
)
{
// Already in the graph. Can happen because we added something that is the same
// as an existing item, but only differs in case.
return
;
}
if
(
currentNode
.
AllChildren
==
null
)
{
currentNode
.
AllChildren
=
new
Dictionary
<
int
,
int
>();
nodes
[
currentNodeIndex
]
=
currentNode
;
// Fall through. to actually add the child to this node.
}
else
{
int
childNodeIndex
;
if
(
currentNode
.
AllChildren
.
TryGetValue
(
editDistance
,
out
childNodeIndex
))
{
// Edit distances collide. Move to this child and add this word to it.
currentNodeIndex
=
childNodeIndex
;
continue
;
}
// Fall through. to actually add the child to this node.
}
currentNode
.
AllChildren
.
Add
(
editDistance
,
nodes
.
Count
);
nodes
.
Add
(
new
Node
(
lowerCaseCharacters
));
return
;
}
return
new
Builder
(
values
).
Create
();
}
public
IList
<
string
>
Find
(
string
value
,
int
?
threshold
=
null
)
...
...
src/Workspaces/Core/Portable/Workspaces.csproj
浏览文件 @
63ca8c23
...
...
@@ -949,6 +949,7 @@
<SubType>
</SubType>
</None>
<Compile
Include=
"Utilities\BKTree.Builder.cs"
/>
<PublicAPI
Include=
"PublicAPI.Shipped.txt"
/>
<PublicAPI
Include=
"PublicAPI.Unshipped.txt"
/>
</ItemGroup>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录