111,097
社区成员




static void Main(string[] args)
{
var a = new List<Item>()
{
new Item() { NA = "NA01", NB = new List<string>() {"NB01", "NB02","NB03","NB04","NB05","NB06","NB07","N08","NB09","NB10","NB11", "NB12","NB13","NB14","NB15","NB16"}},
new Item() { NA = "NA02", NB = new List<string>() {"NB13", "NB14","NB15","NB16","NB17","NB18","NB19","N20","NB21","NB22","NB23", "NB24"}},
new Item() { NA = "NA03", NB = new List<string>() {"NB07","N08","NB09","NB10","NB24","NB25","NB26"}},
new Item() { NA = "NA04", NB = new List<string>() {"NB11", "NB12","NB13","NB27","NB28"}},
new Item() { NA = "NA05", NB = new List<string>() {"NB29"}},
new Item() { NA = "NA06", NB = new List<string>() {"NB10"}},
new Item() { NA = "NA07", NB = new List<string>() {"NB23"}},
};
var res = new List<List<Item>>();
var v = 20;
while (a.Count > 0)
{
var dis = a.Aggregate(new List<string>(), (a1, b) => a1.Union(b.NB).ToList()).Count();
var all = a.Aggregate(new List<string>(), (a1, b) => a1.Concat(b.NB).ToList()).Count();
if (dis > v)
{
foreach (var r in Find(a, v))
{
//这里可以有多个返回结果,为简化只取了第一个
dis = a.Where(s => r.Contains(s.NA)).Aggregate(new List<string>(), (a1, b) => a1.Union(b.NB).ToList()).Count();
all = a.Where(s => r.Contains(s.NA)).Aggregate(new List<string>(), (a1, b) => a1.Concat(b.NB).ToList()).Count();
Console.WriteLine("全部:{0} 去重:{1} 成员:{2}", all, dis, string.Join(", ", r));
var ks = a.Where(x => r.Contains(x.NA)).ToArray();
foreach (var k in ks) a.Remove(k);
break;
}
}
else
{
Console.WriteLine("全部:{0} 去重:{1} 成员:{2}", all, dis, string.Join(", ", a.Select(x=>x.NA)));
break;
}
}
}
static IEnumerable<List<string>> Find(List<Item> o, int v, int deep=0)
{
var r = new List<List<string>>();
var st = new List<List<string>>();
var na = o.Select(x => x.NA).ToList();
foreach (var t in o) r.Add(new List<string>() { t.NA });
for(var i=0;i<r.Count;i++)
{
var p = o.Where(s => r[i].Contains(s.NA)).Aggregate(new List<string>(), (a, b) => a.Concat(b.NB).ToList());
na = o.Where(x => !r[i].Contains(x.NA)).OrderByDescending(x => x.NB.Count + x.NB.Intersect(p).Count() / x.NB.Count).Select(x => x.NA).ToList();
foreach(var t in na)
{
var tmp = new List<string>(r[i]).Concat(new List<string>() { t }).ToList();
var cnt = o.Where(s => r[i].Contains(s.NA)).Aggregate(new List<string>(), (x, y) => x.Concat(y.NB).ToList()).Count();
var uncnt = o.Where(s => tmp.Contains(s.NA)).Aggregate(new List<string>(), (x, y) => x.Union(y.NB).ToList()).Count();
if (uncnt == v)
{
if (st.Count > 0 && st.Where(x => x.Except(tmp).Count() == 0).Count() > 0)
{
continue;
}
st.Add(tmp);
yield return tmp;
}
if(uncnt < v) r.Add(tmp);
}
}
}
private void RightEntity()
{
GroupDN = new List<Entity[]>();
List<Entity> tempList = new List<Entity>();tempList.AddRange(dnList);
while (tempList.Count > 0)
{
List<Entity> GroupEntity = new List<Entity>();
var NowTemp = tempList.OrderByDescending(t => t.Num).First();
GroupEntity.Add(NowTemp);
tempList.Remove(NowTemp);
Entity Next;
int Sum = NowTemp.Num;
do
{
Next = tempList.Where(t=>t.Num<=20-Sum).OrderByDescending(t => t.Num).FirstOrDefault();
if (Next != null) {
GroupEntity.Add(Next);
Sum = Sum + Next.Num;
tempList.Remove(Next);
}
}
while (Next != null);
GroupDN.Add(GroupEntity.ToArray());
}
}
public class Entity
{
public Entity(string dn, int num)
{
DN = dn; Num = num;
}
public string DN { get; private set; }
public int Num { get; private set; }
}