110,533
社区成员
发帖
与我相关
我的任务
分享
List<string[]> list = new List<string[]>{
new string[] {"1","2","1"},
new string[] {"1","2","3"},
new string[] {"1","3","1"},
new string[] {"1","3","3"},
new string[] {"2","2","1"},
new string[] {"2","2","3"},
new string[] {"2","3","1"},
new string[] {"2","3","3"},
new string[] {"3","3","3"}};
var resultList = new List<string[]>();
var num = 0;
while (list.Count != num)
{
var log = (int)Math.Log(list.Count - num, 2);
var take = (int)Math.Pow(2, log);
resultList.Add(MergeArray(list.Skip(num).Take(take).ToList())[0]);
num += take;
}
Console.WriteLine(string.Join(" ", resultList.Select(x => string.Join(",", x))));
调用部分修正为这样就满足你的要求了static List<string[]> MergeArray(List<string[]> list)
{
if (list == null || list.Count == 0)
{
throw new ArgumentException();
}
var x = (int)Math.Log(list.Count, 2);//保证只取最小整数部分
if (x == 0)
{
if (list.Count == 1)
{
return list;
}
else
{
return new List<string[]> { list[0] };
}
}
List<string[]> resultList = new List<string[]>();
for (var i = 0; i < (int)Math.Pow(2, x); i += 2)
{
var li = list[i];
var hi = list[i + 1];
string[] tmp = new string[3];
for (var j = 0; j < 3; j++)
{
tmp[j] = li[j];
if (li[j] != hi[j])
{
tmp[j] += hi[j];
}
}
resultList.Add(tmp);
}
return MergeArray(resultList);
}
严格按照你两两合并的顺序来,如果你将源数据改了,可以得到其他结果
List<string[]> list = new List<string[]>{
new string[] {"1","2","1"},
new string[] {"1","2","3"},
new string[] {"1","3","1"},
new string[] {"1","3","3"},
new string[] {"2","2","1"},
new string[] {"2","2","3"},
new string[] {"2","3","1"},
new string[] {"2","3","3"}};
var resultList = MergeArray(list);
Console.WriteLine(string.Join(",", resultList[0]));
List<string[]> list = new List<string[]>();
list.Add(new string[] { "1", "2", "1" });
list.Add(new string[] { "1", "2", "3" });
string[] arr = new string[list.First().Length];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = string.Join("", list.SelectMany(p=>p[i]).Distinct());
}
Console.WriteLine(string.Join(",", arr));
//result:1,2,13
static void Main(string[] args)
{
List<string[]> list = new List<string[]>();
list.Add(new string[] { "1", "2", "1" });
list.Add(new string[] { "1", "2", "3" });
list.Add(new string[] { "1", "3", "1" });
list.Add(new string[] { "1", "3", "3" });
list.Add(new string[] { "2", "2", "1" });
list.Add(new string[] { "2", "2", "3" });
list.Add(new string[] { "2", "3", "1" });
//list.Add(new string[] { "2", "3", "3" });
//list.Add(new string[] { "3", "3", "3" });
List<string[][]> list2 = list.Select(p => p.Select(s => new string[] { s }).ToArray()).ToList();
string[][] arr;
int count;
while (true)
{
count = list2.Count;
foreach (var ar in list2)
{
arr = list2.Where(p => p != ar && Eq(p, ar)).FirstOrDefault();
if (arr == null) continue;
for (int i = 0; i < ar.Length; i++)
{
arr[i] = ar[i].Union(arr[i]).ToArray();
}
list2.Remove(ar);
break;//循环体被改变,立即跳出
}
if (list2.Count == count) break;
}
foreach(var x in list2)
{
Console.WriteLine(string.Join(",", x.Select(p=>string.Join("",p))));
}
}
static bool Eq(string[][] a, string[][] b)
{
int x = 0;
for (int i = 0; i < a.Length; i++)
{
if (a[i].Length != b[i].Length || a[i].Intersect(b[i]).Count()!=a[i].Length) x++;
}
return x <= 1;
}
result:
1,23,13
2,2,13
2,3,1