我正在尝试制作一个c#程序,它将为我比较两个文件,并告诉我具体部分的差异。我已经能够在循环时将所需的部分放入变量中,但是我现在想要将这些部分添加到每个文件有3个值的键中,因此总共有6个值的键然后我将与其他人进行比较。但是我只能使用我拥有的循环一次添加3个值,所以我需要能够将最后3个值添加到密钥而不会覆盖前3个。
来自文件的数据示例:
[\Advanced\Rules\Correlation Rules\Suspect_portscan\];
CheckDescription =S Detect Port scans;
Enabled =B 0;
Priority =L 3;
我已经设法将我需要的东西变成变量所以我有: 字符串SigName将是“Suspect_portscan” Int Enabled,Priority,Blocking为0 3且分别为null。
然后我想创建一个字典类型的东西,其中一个键是SigName,前三个值是enabled,priority,blocking。 然后,当循环遍历第二个文件时,我想为最后3个值槽中的相同SigName(也就是密钥)的启用,优先级和阻塞添加第二个文件设置。
然后我会将其与自身进行比较,例如'if signame(0)!= signame(3)',因此如果启用文件1与启用文件2不同,请记下并告诉我。
但是我遇到的问题是无法将数据放入字典或查找中,我完全难过了。看起来我应该使用带有值列表的字典,但我不能让它在第二个循环中工作。
感谢。
代码:
static void Main()
{
Dictionary<string, List<int>> PolicyDictionary = new Dictionary<string, List<int>>();
int Counter = 0, TempCounter = 0;
String[] PolicyOne = System.IO.File.ReadAllLines(@"filepath");
string[] PolicyTwo = System.IO.File.ReadAllLines(@"filepath2");
foreach (string lines in PolicyOne)
{
if ((lines.Contains("CheckDescription")) && (!lines.Contains("userdefined network event template")))
{//if true do this
TempCounter = Counter;
int FirstSlashes = (PolicyOne[(TempCounter - 1)]).IndexOf(@"\", 28);
int LastSlashes = (PolicyOne[(TempCounter - 1)]).LastIndexOf(@"\");
string SigName = (PolicyOne[(TempCounter - 1)]).Substring(FirstSlashes+1,(LastSlashes-FirstSlashes)-1);
Char Enabled = (PolicyOne[(TempCounter + 1)])[(PolicyOne[(TempCounter + 1)]).Length - 2];
Char Priority = (PolicyOne[(TempCounter + 2)])[(PolicyOne[(TempCounter + 2)]).Length - 2];
Char Blocking = (PolicyOne[(TempCounter + 3)])[(PolicyOne[(TempCounter + 3)]).Length-2];
PolicyDictionary[SigName] = new List<int> {Enabled,Priority,Blocking};
}
// end if
Counter++;
}
// end for each
foreach (string lines in PolicyTwo)
{
if ((lines.Contains("CheckDescription")) && (!lines.Contains("userdefined network event template")))
{//if true do this
Counter = 0;
TempCounter = Counter;
int FirstSlashes = (PolicyTwo[(TempCounter - 1)]).IndexOf(@"\", 28);
int LastSlashes = (PolicyTwo[(TempCounter - 1)]).LastIndexOf(@"\");
string SigName = (PolicyTwo[(TempCounter - 1)]).Substring(FirstSlashes + 1, (LastSlashes - FirstSlashes) - 1);
Char Enabled = (PolicyTwo[(TempCounter + 1)])[(PolicyOne[(TempCounter + 1)]).Length - 2];
Char Priority = (PolicyTwo[(TempCounter + 2)])[(PolicyOne[(TempCounter + 2)]).Length - 2];
Char Blocking = (PolicyTwo[(TempCounter + 3)])[(PolicyOne[(TempCounter + 3)]).Length - 2];
// here I will just end up overwriting it, but im not sure how to get arround this.
PolicyDictionary[SigName] = new List<int> { Enabled, Priority, Blocking };
}
// end if
Counter++;
}
// end for each
Console.ReadKey();
答案 0 :(得分:0)
我认为我掌握了你想要做的事情,但代码示例可能有所帮助。
听起来您需要为要存储的值创建一个类型。
e.g。
public class FileContent
{
public char Enabled {get; set;}
public string Priority {get; set;}
public string SigName {get; set;
/*whatever else you need*/
}
然后,您可以从每个文件(或许多文件)创建此类型的两个实例。如果要比较特定属性,可以。如果你需要存储在字典中,你可以。
或者,您可以重写Equals(),或实现IEquatable以启用类型比较。
当然,这是假设我理解这个问题。
答案 1 :(得分:0)
由于我现在不知道你的代码是什么样的,我只有你的描述,我会建议像这样的
public class FileData
{
public int Enabled {get; set;}
public int Priority {get; set;}
public int Blocking {get; set;}
}
然后创建两个词典
var File1 = new Dictionary<string, Filedata>();
var File2 = new Dictionary<string, Filedata>();
在浏览两个文件时填写这两个文件,您的SigName是您词典的键(字符串)
比较它们是这样的:
foreach (var item in File1)
{
var file1Data = item.Value;
var file2Data = file2[item.Key];
if (file1Data.Enabled != file2Data.Enabled)
{
// do what you want
}
}