2009-09-03 71 views
0

我有這個類的LINQ查詢數據聚合

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

我不知道有沒有很好地解釋它...

在實踐中,想象你擁有一個多邊形的所有點,我想通過給出每個多邊形所有點之間的連接列表來獲得查詢中所有項目的一行。

(我的列表中包含一個以上的多邊形)

有一點不應該被列入的結果,如果沒有連接到所有其他人。

這是我的名單內容的例子:

VAR組=行:

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

更多細節之間的三角.Where(x => x.ConnectionsIndex.Split(',')。Contains(line。ConnectionsIndex.Split(',')[0])|| x。ConnectionsIndex.Split(',')。Contains(line 。ConnectionsIndex.Split(',')[1]))。ToList(); if(group.Count()== 1) { straight_lines.Add(line); } 其他 {// 在這裏,我有一個「工作組」。我想distinc點 }

+0

嗯......恐怕我還是不明白你想要做什麼。你可以舉一些例子(3或4)的輸入集合和所需的輸出嗎? – 2009-09-03 10:47:55

+0

我嘗試了一些東西,但是對於您的示例數據,它給出了 「166,171,174,333,175,334,167,172,335」。你需要確定確切的多邊形? – Botz3000 2009-09-03 12:22:30

+0

我同意需要更多細節。你的價值觀是「x,y」座標,並且你試圖找出所有連接點形成一條線? – MattH 2009-09-03 14:21:29

回答

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

如果發現或已知更好的解決方案,歡迎您!

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爲字符串,而不是一個單一的一個分隔字符串的集合,當然:)

+0

我必須有它的單分隔字符串的形式,以便NHibernate保存... ...我會很快檢查你的提示。 – 2009-09-03 10:30:11

+0

對不起,但這不是正確的答案...我必須編輯我的問題,並添加更多的細節.. – 2009-09-03 10:33:25

0

我用這個的:

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

沒有抱歉,但它返回的結果與Jon Skeet的一樣 – 2009-09-03 10:44:43

0

只是一個說明,我認爲你所要求的是一種方法來找到最大的派系(一個來自圖論的概念)。已知這是一個NP難題。我認爲你的版本有時會起作用,希望對你感興趣的案例有所幫助。但是,並不適用於任何可能與其他任何東西相關的複雜情況。事實上,如果你有很多節點,這些情況是不可行的,即使有大量的CPU週期預算(不管LINQ如何)。