2009-09-03 5 views
0

나는LINQ 쿼리는

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

내 Linq에 문제가 내가이

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

에이 라인

var l1 = new Line{ ConnectionsIndex="01,02"}; 
var l2 = new Line{ ConnectionsIndex="02,03"}; 
var l3 = new Line{ ConnectionsIndex="01,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

더 자세히 사이의 삼각형 ConnectionIndex.Split (','). Contains (행 (ConnectionsIndex.Split (',') [0]) || .ConnectionsIndex.Split . ConnectionsIndex.Split (',') [1])). ToList(); if (group.Count() == 1) { straight_lines.Add (line); 다른 } { // 여기에 내가

+0

흠 ... 나는 아직도 당신이하려는 것을 이해하지 못한다고 생각합니다. 입력 컬렉션과 원하는 출력의 몇 가지 예 (3 또는 4)를 제공 할 수 있습니까? –

+0

나는 무언가를 시도했지만 샘플 데이터의 경우 "166,171,174,333,175,334,167,172,335"라고 표시합니다. 정확한 다각형을 결정해야합니까? – Botz3000

+0

자세한 내용이 필요하다는 데 동의합니다. 여러분의 가치관은 "x, y"좌표이고, 연결된 모든 점을 하나의 선으로 만들기 위해 노력하고 있습니까? – MattH

답변

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

뭔가 같은 distinc 점 } 싶어 .. 지점 사이의 모든 라인과 함께 "그룹"이 있습니다

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

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

이하지 않습니다 연결을 주문할 수 있지만 필요한 경우 쉽게 연결할 수 있습니다.

은 물론 :) 내가 이것을 사용

+0

NHibernate에서 easly로 저장하기 위해 단일 구분 문자열 형식이어야합니다 ... 힌트를 곧 확인하겠습니다. –

+0

죄송하지만 올바른 대답은 아닙니다 ... 내 질문을 편집하고 세부 사항을 추가해야합니다 .. –

0

의 대신에 하나의 구분 된 문자열의 문자열의 집합으로 ConnectionsIndex이 행복이라면이 모든 청소기 다음과 같습니다

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

죄송 합니다만 Jon Skeet의 답변과 동일한 결과를 반환합니다. –

0

당신이 요구하는 것은 최대 파벌 (그래프 이론의 개념)을 찾는 방법입니다. 이것은 NP-Hard 문제로 알려져 있습니다. 나는 당신의 버전이 때때로 작동 할 것이고, 당신이 관심을 갖고있는 경우에 희망적이라고 생각한다. 그러나 어떤 것이 다른 것에 연결될 수있는 복잡한 경우에는 그렇지 않다. 실제로 많은 노드가있는 경우 LINQ와 상관없이 큰 CPU주기 예산이 있어도 이러한 경우는 실현할 수 없습니다.

관련 문제