如何过滤2 List <list <string>&gt;选择以获得匹配的BLOCKS,持续时间最短

时间:2017-10-08 18:41:23

标签: c# regex linq

美好的一天。 我是c#编程的新手。 我当前的项目由2个独立的主文件夹组成,包含多个文件夹,每个文件中有多个行不同的文件。对于Folder-A,总共有大约4000个文件,平均2000个到10&#000; 000行/文件...大致相同的文件夹-B。

我已将这些文件和行放入列表中......并使用&#34;文本&#34;做了一些事情。某些文件中的行。

现在,我需要匹配它们以查看文件夹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中所有文件的所有行。

希望这一切都有意义。因为我在业余时间做这些,这是一个复杂的逻辑 :) 问候

0 个答案:

没有答案