各位老师,目前做一个项目如下方数据结构,目的想把C列的值进行整合,如原来C1、C2、C3,现在要在A列和B列相同的情况下整合成 C1~3 这样的格式,请问我应该如何去做?请赐教!谢谢!数据表:ID A列 B列 C列
1 A1 B1 C1
2 A2 B1 C1
3 A2 B1 C2
4 A2 B2 C1
5 A2 B2 C2
6 A2 B2 C3
7 A3 B1 C1
8 A4 B1 C1
结果要得出:A列 B列 C列
A1 B1 C1
A2 B1 C1~2
A2 B2 C1~3
A3 B1 C1
A4 B1 C1
1 A1 B1 C1
2 A2 B1 C1
3 A2 B1 C2
4 A2 B2 C1
5 A2 B2 C2
6 A2 B2 C3
7 A3 B1 C1
8 A4 B1 C1
结果要得出:A列 B列 C列
A1 B1 C1
A2 B1 C1~2
A2 B2 C1~3
A3 B1 C1
A4 B1 C1
public class ABC
{
public int ID { get; set; }
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
dt.Rows.Add(new object[] { 1, "A1", "B1", "C1" });
dt.Rows.Add(new object[] { 2, "A2", "B1", "C1" });
dt.Rows.Add(new object[] { 3, "A2", "B1", "C2" });
dt.Rows.Add(new object[] { 4, "A2", "B2", "C1" });
dt.Rows.Add(new object[] { 5, "A2", "B2", "C2" });
dt.Rows.Add(new object[] { 6, "A2", "B2", "C3" });
dt.Rows.Add(new object[] { 7, "A3", "B1", "C1" });
dt.Rows.Add(new object[] { 8, "A4", "B1", "C1" });
Dictionary<string, ABC> dic = new Dictionary<string, ABC>();
Regex reg = new Regex(@"(?<=^C\d+)(?:~\d+|$)");
string key = string.Empty;
foreach (DataRow r in dt.Rows)
{
key = r["A"].ToString() + r["B"].ToString();
if (!dic.ContainsKey(key))
dic.Add(key, new ABC() { A = r["A"].ToString(), B = r["B"].ToString(), C = r["C"].ToString() });
else
dic[key] = new ABC() { A = r["A"].ToString(), B = r["B"].ToString(), C = reg.Replace(dic[key].C, "~" + new Regex(@"\d+").Match(r["C"].ToString()).Value) };
}
foreach (KeyValuePair<string, ABC> k in dic)
Console.WriteLine("{0} {1} {2}", k.Value.A, k.Value.B, k.Value.C);
}
/*
A1 B1 C1
A2 B1 C1~2
A2 B2 C1~3
A3 B1 C1
A4 B1 C1*/
dt.Columns.Add("ID");
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
dt.Rows.Add(new object[] { 1, "A1", "B1", "C1" });
dt.Rows.Add(new object[] { 2, "A2", "B1", "C1" });
dt.Rows.Add(new object[] { 3, "A2", "B1", "C2" });
dt.Rows.Add(new object[] { 4, "A2", "B2", "C1" });
dt.Rows.Add(new object[] { 5, "A2", "B2", "C2" });
dt.Rows.Add(new object[] { 6, "A2", "B2", "C3" });
dt.Rows.Add(new object[] { 7, "A3", "B1", "C1" });
dt.Rows.Add(new object[] { 8, "A4", "B1", "C1" }); var query = from d in dt.AsEnumerable() group d by new { one = d.Field<string>("A"), two = d.Field<string>("B") } into g select new { A = g.Key.one, B = g.Key.two, C = g.Select(x => x.Field<string>("C")) };
foreach (var q in query)
{
Console.WriteLine(q.A + " " + q.B + " " + (q.C.Count() == 1 ? q.C.First() : q.C.First() + "~" + new Regex(@"\d+").Match(q.C.Last()).Value));
}
/*
A1 B1 C1
A2 B1 C1~2
A2 B2 C1~3
A3 B1 C1
A4 B1 C1*/