Linq查询数据聚合

时间:2009-09-03 10:22:08

标签: linq aggregate

我有这个班级

public class Line
{
  public string ConnectionsIndex{get;set;}
}

我的Linq问题是我必须聚合这些行

var l1 = new Line{ ConnectionsIndex="01,02"};
var l2 = new Line{ ConnectionsIndex="02,03"};
var l3 = new Line{ ConnectionsIndex="01,03"};

进入这个

var l4 = new Line{ ConnectionsIndex="01,02,03"};

可以使用Linq吗?

DETAIL:

当我添加我的集合中的其他项目时,事情会更复杂(至少对我而言)。

var l5 = new Line (ConnectionsIndex = "02,04"); 
var l6 = new Line (ConnectionsIndex = "03,06"); 

因为不存在03,04,01,04,01,06和02,06对的其他行

我不知道我是否已经解释得很好......

在实践中,假设您拥有多边形的所有点,我想通过给出每个多边形的所有点之间的连接列表来从查询中获取所有项的一行。

(我的列表包含多个多边形)

如果未与所有其他人连接,则不应在结果中包含一个点。

这是我的列表内容的一个示例:

ConnectionsIndex="166,171"
ConnectionsIndex="166,174"
ConnectionsIndex="166,333"
ConnectionsIndex="169,170"
ConnectionsIndex="171,175"
ConnectionsIndex="171,334"
ConnectionsIndex="167,174"
ConnectionsIndex="172,174"
ConnectionsIndex="174,335"
ConnectionsIndex="177,341"
ConnectionsIndex="180,200"
ConnectionsIndex="181,183"
ConnectionsIndex="182,199"
ConnectionsIndex="184,185"
ConnectionsIndex="186,188"
ConnectionsIndex="189,192"
ConnectionsIndex="190,230"
ConnectionsIndex="191,375"

在此列表中,您可以获得166,171和334之间的三角形

更多细节:

var group = lines.Where(x => x.ConnectionsIndex.Split(',')。包含(line。ConnectionsIndex.Split(',')[0])||                                 X。 ConnectionsIndex.Split(',')。包含(line.ConnectionsIndex.Split(',')[1]))。ToList();                 if(group.Count()== 1)                 {                     straight_lines.Add(线);                 }                 其他                 {                     //这里我有一个“组”,点之间的所有线。我想获得分数                 }

4 个答案:

答案 0 :(得分:1)

类似的东西:

var connections = (from line in lines
                   from connection in line.Split(',')
                   select connection).Distinct()
                                     .ToArray();

Line line = new Line { ConnectionsIndex = string.Join(",", connections) };

这不会对连接进行排序,但如果需要,可以轻松添加。

如果您乐意将ConnectionsIndex作为字符串集合而不是单个分隔字符串,那么这将更加清晰:当然:)

答案 1 :(得分:0)

我用过这个:

var l4 = new Line{ 
    ConnectionsIndex = 
        string.Join(",", (lines.SelectMany(x => x.ConnectionsIndex.Split(','))
                               .Distinct()
                               .OrderBy(s => s)).ToArray())
};

答案 2 :(得分:0)

这是我发现的糟糕方式......它有效!

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();

如果您找到或了解更好的解决方案,欢迎您!

答案 3 :(得分:0)

请注意,我认为你所要求的是一种寻找最大派系的方法(图论中的概念)。这被称为NP-Hard问题。我认为您的版本有时会起作用,并希望您感兴趣的那些案例。但是,不是因为任何事情可能与其他任何东西相关的复杂情况。实际上,如果你有很多节点,那么这些情况是不可行的,即使CPU周期预算很大(不管LINQ如何)。