"Win32_F", "Win32_I", "Win32_L", "Win32_M", "Win32_N", "Win32_O", "Win32_P",
"Win32_R", "Win32_Ser", "Win32_Soft", "Win32_System", "Win32_S", "Win32_T",
"Win32_U", "Win32_V", "Win32_W", "Win32", "Workflow", "WS", "Wi", "Wo", "Xe", "XEvent",
"__Namespace", "__Class", "__Instance", "__" };
public static void Classify(string name, ref TreeNode node)
{
Globals.Classify(letters, name, ref node);
Globals.Classify(prefixes, name, ref node);
}
}
public static class MyEvents
{
static string[] prefixes = {
"HD", "Kernel", "MSFT", "MSNdis", "MS", "Port", "Process", "Reg",
"Win32", "Workflow", "__Namespace", "__Class", "__Instance", "__" };
public static void Classify(string name, ref TreeNode node)
{
Globals.Classify(prefixes, name, ref node);
}
}
public static class MyOther
{
static string[] letters = {
"A", "B", "C", "D", "E", "F", "H", "I", "K", "L",
"M", "O", "P", "R", "S", "T", "U", "W" };
static string[] prefixes = {
"Ac", "Al", "Cs", "Di", "Dr", "Fi", "Get", "Hd", "He", "HNet",
"Id", "Im", "ISCSI", "Is", "Mm", "MSNdis", "Mp", "MSi", "MSS", "MSW",
"MSF", "MSN", "MS1", "MSP", "MST", "MSK", "MSM", "MS_", "MS", "Mu", "Pa", "Pe", "Po",
"Process", "Re", "Rs", "Se", "Sy", "Tc", "Th", "Tp", "Ts", "Ud", "Um",
"Vs", "Win32", "Wh", "Wm", "__" };
public static void Classify(string name, ref TreeNode node)
{
Globals.Classify(letters, name, ref node);
Globals.Classify(prefixes, name, ref node);
}
}
}
Сначала все множество разбивается на классы эквивалентности по первой букве имени класса. Далее полученные подмножества разбиваются по признакам, которые, были выявлены в ходе анализа имен всего множества классов. Это результат длительной и неблагодарной работы. Надеюсь, тем не менее, что выявленные признаки обозначают некоторую общность классов. Здесь надо еще поработать.
Методы Classify и FindOrAddNode, реализующие алгоритм разбиения (классификации) и создания нового узла дерева классов, я решил вынести в класс Globals, так как они имеет обобщенную функциональность. Приведем весь код этого класса.
using System;
using System.Windows.Forms;
using System.IO;
namespace Library
{
public class Globals
{
public static void Classify(string[] prefixes, string name, ref TreeNode node)
{
bool found = false;
foreach (string s in prefixes)
{
found = name.StartsWith(s, StringComparison.InvariantCultureIgnoreCase);
if (found)
{
FindOrAddNode(s, ref node);
break;
}
}
}
public static void FindOrAddNode(string s, ref TreeNode node)
{
int pos = node.Nodes.IndexOfKey(s);
node = pos == -1 ?
node.Nodes.Add(s, s, 3, 2) :
node.Nodes[pos];
}
public static string FindFolder(string name)
{
string dir = Application.StartupPath;
for (char slash = '\\'; dir != null; dir = Path.GetDirectoryName(dir))
{
string res = dir.TrimEnd(slash) + slash + name;
if (Directory.Exists(res))
return res + slash;
}
return null;
}
}
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.