0

我有这门课

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(',')。包含(line.ConnectionsIndex.Split(',')[1])).ToList(); if (group.Count()==1) { straight_lines.Add(line); } else { //这里我有一个“组”,所有点之间的线..我想得到不同的点 }

4

4 回答 4

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字符串集合而不是单个分隔字符串作为字符串集合,这一切都会更清晰:)

于 2009-09-03T10:25:38.723 回答
0

我用这个:

var l4 = new Line{ 
    ConnectionsIndex = 
        string.Join(",", (lines.SelectMany(x => x.ConnectionsIndex.Split(','))
                               .Distinct()
                               .OrderBy(s => s)).ToArray())
};
于 2009-09-03T10:38:18.957 回答
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();

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

于 2009-09-03T13:38:31.640 回答
0

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

于 2009-12-02T17:27:08.737 回答