【问题标题】:Linq query for data aggregation用于数据聚合的 Linq 查询
【发布时间】:2009-09-03 10:22:08
【问题描述】:

我有这门课

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 做吗?

详情:

当我添加收藏中的其他物品时,事情变得更加复杂(至少对我而言)。

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(',').Contains(line.ConnectionsIndex.Split(',')[0]) || X。 ConnectionsIndex.Split(',').Contains(line.ConnectionsIndex.Split(',')[1])).ToList(); if (group.Count()==1) { 直线。添加(线); } 别的 { //这里我有一个“组”,其中包含点之间的所有线。我想获得不同的点 }

【问题讨论】:

  • 嗯...恐怕我还是不明白你在做什么。您能否给出一些输入集合和所需输出的示例(3 个或 4 个)?
  • 我已经尝试了一些方法,但是对于您的示例数据,它给出了“166,171,174,333,175,334,167,172,335”。您需要确定确切的多边形吗?
  • 我同意需要更多细节。您的值是否是“x,y”坐标,并且您试图计算出所有连接点以形成一条线?
  • 我的多边形示例是为了简化我的域...我在一家能源分销公司工作,每对数字都是两个断路器之间的连接。一个多边形是所有涉及的断路器之间的“星形”连接。但我正在将这对(旧数据库)转换为新形式..

标签: linq aggregate


【解决方案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 作为字符串集合而不是单个分隔字符串,这一切都会更简洁:)

【讨论】:

  • 我必须以单个分隔字符串的形式使用 NHibernate 轻松保存它...我会尽快检查您的提示。
  • 抱歉,这不是正确的答案...我必须编辑我的问题并添加更多详细信息..
【解决方案2】:

我用过这个:

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

【讨论】:

  • 不抱歉,但它返回的结果与 Jon Skeet 的结果相同
【解决方案3】:

这是我发现的不好的方法......而且它有效!

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多