美好的一天。 我是c#编程的新手。 我当前的项目由2个独立的主文件夹组成,包含多个文件夹,每个文件中有多个行不同的文件。对于Folder-A,总共有大约4000个文件,平均2000个到10� 000行/文件...大致相同的文件夹-B。
我已将这些文件和行放入列表中......并使用"文本"做了一些事情。某些文件中的行。
现在,我需要匹配它们以查看文件夹A的哪些文件的哪些部分匹配文件夹B的文件部分。
每个文件夹只允许一个匹配块,因为可能有许多不同的块,如果找到块的多个匹配,则需要增加块大小,最大为行的最大行数。文件。
我的方法确实有效,但是,因为我没有进入日常编程,我的逻辑可能不是最快的。
这就是我所做的:
public static bool ContainsAllItems(List<string> a, List<string> b)
{
return !b.Except(a).Any();
}
int fileCountA = 0;
int lineCountA = 0;
int fileCountB = 0;
int lineCountB = 0;
int filenrB = 0;
int linenrB = 0;
bool Found1 = false;
bool Found2 = false;
bool FoundReset =false;
int ChecklinestartA = 0;
int ChecklinestartB = 0;
int Checkline = 3;
List<string> TempListA = new List<string>();
List<string> TempListB = new List<string>();
List<KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>>> PlaceFound = new List<KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>>>();
TempListA.Clear();
TempListB.Clear();
foreach (List<string> testlistA in FolderA)
{
fileCountA++;
lineCountA = 0;
ChecklinestartA = 0;
do //Do While File A
{
lineCountA++;
TempListA.Clear();
for (int i = ChecklinestartA; i <= ChecklinestartA + Checkline; i++)
{
TempListA.Add(testlistA[i]);
}
foreach (List<string> testlistB in FolderB)
{
fileCountB++;
lineCountB = 0;
ChecklinestartB = 0;
do//Do While File B
{
lineCountB++;
TempListB.Clear();
if (!Found1)
{
for (int i = ChecklinestartB; i <= ChecklinestartB + Checkline; i++)
{
if (testlistB[i] != null)
{
TempListB.Add(testlistB[i]);
}
}
Found1 = ContainsAllItems(TempListA, TempListB);
filenrB = fileCountB;
linenrB = lineCountB;
}
else if ((Found1)&&(!Found2))
{
for (int i = ChecklinestartB; i <= ChecklinestartB + Checkline; i++)
{
if (testlistB[i] != null)
{
TempListB.Add(testlistB[i]);
}
}
Found2 = ContainsAllItems(TempListA, TempListB);
}
else
{
break;
}
ChecklinestartB++;
}
while ((ChecklinestartB + Checkline) <= TempListB.Count);//Do While File B
if ((Found1) && (Found2))
{
Found1 = false;
Found2 = false;
filenrB = 0;
linenrB = 0;
FoundReset = true;
break;
}
}
if ((!FoundReset) && (Found1))
{
//only one match, reset checkline, increase startingpoint on File A list A, reset found1, add the match to the list of place found, with file a, file nr, line nr, and file B, file nr, line nr as references.
Found1 = false;
KeyValuePair<int, int> FileAPosition = new KeyValuePair<int, int>(fileCountA, lineCountA);
KeyValuePair<int, int> FileBPosition = new KeyValuePair<int, int>(filenrB, linenrB);
KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>> ThisPosition = new KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>>(FileAPosition, FileAPosition);
PlaceFound.Add(ThisPosition);
ChecklinestartA = ChecklinestartA + Checkline;
}
else if (FoundReset)
{
//double found, increase amount of lines to be checked, found1 and 2 already resetted
FoundReset = false;
Checkline=Checkline+2;
}
else
{
//nothing found increase startingpoint on file A, up to where do>>while finish
ChecklinestartA++;
}
我需要更好或更快的方式来排序逻辑和块。
基本上..它从文件夹A开始,列表的第一个文件,然后创建一个&#34;块&#34;该文件的前3行。
它转到文件夹B,第一个文件,创建相同的块大小。 比较它们......如果它匹配,标记为找到1,然后将文件夹B file1块移动一行或几行,继续匹配过程,直到完成第一个文件,转到下一个。
继续匹配周期,如果它通过文件夹B中的所有文件而没有另外匹配,则匹配位置被记录。如果找到第二个匹配,则匹配位置被重置,文件A块大小增加或移动。
一旦块大小与文件大小匹配,并且它们仍然是多个匹配的,则应将其标记并计为&#34;特殊事件&#34;
如果未找到该块的匹配项,则文件夹A文件1中的块位置将一直移动。这一切都会重复,直到它通过文件夹A中所有文件的所有行。
希望这一切都有意义。因为我在业余时间做这些,这是一个复杂的逻辑 :) 问候