using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Program
{
static Dictionary<string, List<string>> parse(string input)
{
var res = new Dictionary<string, List<string>>();
foreach (string line in input.Replace("\r", "").Split('\n'))
{
var a1 = line.Split(':');
var a2 = a1.Last().Split('、');
res.Add(a1.First(), new List<string>(a2));
}
return res;
}
public static void Main()
{
string srcOrig =
@"曹操:冀州、兗州、青州、徐州、梁州、雍州、豫州
孫權:揚州
劉備:益州、荊州
黑大:潮州
梅西:美州";
string srcNew =
@"曹操:冀州、兗州、青州、潮州、梁州、雍州、豫州
孫權:揚州、荊州、交州
劉備:益州
黑大:徐州
魯本:美州";
//解析轉為Dictionary<string, List<string>>資料結構
var origTerritory = parse(srcOrig);
var newTerritory = parse(srcNew);
StringBuilder sb = new StringBuilder();
//利用Union結合新舊設定所有領袖
foreach (string leader in origTerritory.Keys.Union(newTerritory.Keys))
{
//取得轄區清單,無資料時取空集合
var origList = origTerritory.ContainsKey(leader) ?
origTerritory[leader] : new List<string>();
var newList = newTerritory.ContainsKey(leader) ?
newTerritory[leader] : new List<string>();
//從新清單剔除舊清單已有項目,即為待增加項目
var toAdd = newList.Except(origList);
//從舊清單剔除新清單已有項目,即為待刪除項目
var toDel = origList.Except(newList);
//產生註解
sb.AppendFormat("--{0} 刪:{1} 增:{2}\n", leader,
string.Join(",", toDel.ToArray()),
string.Join(",", toAdd.ToArray()));
//【資安提醒】
// 為求簡化,本例假設資料源自內部系統,已排除SQL Injection風險,
// 若無法確認資料可靠性時,請勿使用外部輸入資料組裝SQL指令
foreach (var d in toDel)
{
sb.AppendFormat(
"DELETE FROM Territory WHERE Leader='{0}' AND State='{1}'\n",
leader, d
);
}
foreach (var a in toAdd)
{
sb.AppendFormat(
"INSERT INTO Territory VALUES ('{0}','{1}')\n",
leader, a
);
}
}
Console.Write(sb.ToString());
}
}