我有这门课
公共课线{ public string ConnectionsIndex {get; set;}}
我的Linq问题是我必须聚合这些行
var l1 = new Line {ConnectionsIndex =“01,02”};var l2 = ne
这是我发现的糟糕方式......它有效!
var l = linee.Distinct( (a, b) => a.ConnectionsIndex == b.ConnectionsIndex,x=>x.ConnectionsIndex.GetHashCode()) .ToList(); var single_lines = new List<Linea>(); var multiple_lines = new List<Linea>(); foreach (var linea in l) { var group = l .Where(x => x.ConnectionsIndex.Split(',').Contains(linea.ConnectionsIndex.Split(',')[0]) || x.ConnectionsIndex.Split(',').Contains(linea.ConnectionsIndex.Split(',')[1])).ToList(); if (group.Count()==1) { single_lines.Add(linea); } else { var indexes = new List<string>(); var dist = group.Select(x => new {Index = x.ConnectionsIndex.Split(',').ToList()}).ToList(); foreach (var linea1 in dist) { indexes=indexes.Concat(linea1.Index).ToList(); } var indexstring = new StringBuilder(); foreach (var s in indexes.Distinct().OrderBy(x=>Convert.ToInt32(x))) { indexstring.Append(s).Append(','); } indexstring.Remove(indexstring.Length - 1, 1); multiple_lines.Add(new Linea() {ConnectionsIndex = indexstring.ToString()}); } } var multi_distinct=multiple_lines.Distinct( (a, b) => a.ConnectionsIndex == b.ConnectionsIndex, x => x.ConnectionsIndex.GetHashCode()) .ToList(); linee = single_lines.Concat(multi_distinct).ToList();
如果您找到或了解更好的解决方案,欢迎您!
我用过这个:
var l4 = new Line{ ConnectionsIndex = string.Join(",", (lines.SelectMany(x => x.ConnectionsIndex.Split(',')) .Distinct() .OrderBy(s => s)).ToArray()) };
就像是:
var connections = (from line in lines from connection in line.Split(',') select connection).Distinct() .ToArray(); Line line = new Line { ConnectionsIndex = string.Join(",", connections) };
这不会对连接进行排序,但如果需要,可以轻松添加。
如果您乐意拥有,这一切都会更加清洁 ConnectionsIndex 作为字符串的集合而不是单个分隔的字符串,当然:)
ConnectionsIndex
请注意,我认为你所要求的是一种寻找最大派系的方法(图论中的概念)。这被称为NP-Hard问题。我认为您的版本有时会起作用,并希望您感兴趣的那些案例。但是,不是因为任何事情可能与其他任何东西相关的复杂情况。实际上,如果你有很多节点,即使CPU周期预算很大(无论LINQ如何),这些情况都是不可行的。