2016-11-22 1 views
1

3D 배열로 문자열을 변환하고,과 같이 2 차원 배열로 구분 된 문자열로 변환 구현 LINQ를 가질 : 나는 우연히 차원에서이 일을 만들려고사용 LINQ 내가 예를 보았다

using System; 
using System.Linq; 

namespace AACOBusinessModel.Extensions 
{ 
    [Serializable] 
    public class TwoDimensionalStringArray 
    { 
    public TwoDimensionalStringArray(string data) 
    { 
     // 1;2;3^^4;5;6 
     this.Data = (
      from string line 
      in data.Split(new string[] { "^^" }, StringSplitOptions.RemoveEmptyEntries) 
      select line.Split(';') 
     ).ToArray(); 
    } 

    public TwoDimensionalStringArray() { } 

    public readonly string[][] Data = { }; 

    public override string ToString() 
    { 
     return string.Join("^^", 
     from string[] line 
     in Data 
     select string.Join(";", line) 
    ); 
    } 
    } 
} 

문제 :

using System; 
using System.Linq; 

namespace AACOBusinessModel.Extensions 
{ 
    [Serializable] 
    public class ThreeDimensionalStringArray 
    { 
    public ThreeDimensionalStringArray(string data) 
    { 
     // 1;2;3^^4;5;[email protected];4;4^^7;7;7 
     this.Data = (
      from string line2D 
      in data.Split(new string[] { "@" }, StringSplitOptions.RemoveEmptyEntries) 
      from string line 
      in line2D.Split(new string[] { "^^" }, StringSplitOptions.RemoveEmptyEntries) 
      select line.Split(';') 
     ); 
    } 

    public ThreeDimensionalStringArray() { } 

    public readonly string[][][] Data = { }; 

    public override string ToString() 
    { 
     return string.Join("@", 
     from string[][] line2D 
     in Data 
     select string.Join("^^", 
      from string[] line 
      in line2D 
      select string.Join(";", line) 
     ) 
    ); 
    } 
    } 
} 

2D로 끝나는 선택은 배열로 변환되어 2D 배열을 만드는 것으로 이해합니다.

3D로 끝나는 선택은 2D 배열의 모음을 선택해야합니다. 나는 이것을 어떻게하는지 모른다.

UPDATE는

나는이 함께했다하지만 가능하다면 나는 쿼리 구문을하고 싶습니다.

this.Data = data 
    .Split(new[] { "@" }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(table => table.Split(new[] { "^^" }, StringSplitOptions.RemoveEmptyEntries) 
     .Select(row => row.Split(';')) 
     .ToArray()) 
    .ToArray(); 

쿼리 SYNAX에서 :

this.Data = (
    from table in data.Split(new[] { "@" }, StringSplitOptions.RemoveEmptyEntries) 
    select 
    (
     from row in table.Split(new[] { "^^" }, StringSplitOptions.RemoveEmptyEntries) 
     select row.Split(';') 
    ).ToArray() 
).ToArray(); 

답변

2

확실하지 중첩 된 컬렉션을 반환하려면 중첩 된 select 절이 필요합니다.

목록을 제작 한 다음

this.Data = (
    from string line2D 
    in data.Split(new string[] { "@" }, StringSplitOptions.RemoveEmptyEntries) 
    select new List<string>( 
     from string line 
     in line2D.Split(new string[] { "^^" }, StringSplitOptions.RemoveEmptyEntries) 
     select line.Split(';')).ToArray()); 
+0

는 AB이고; a 및 D^a 및 S, S @의 t는 H; a 및 N ^^에게 Y 케이, O, U는 제'.ToArray 제거되었다 – toddmo

1

당신은거야이 쿼리 구문에서 수행하지만, 여기에 메서드 구문 버전입니다되어야하는

public ThreeDimensionalStringArray(string data) 
{ 
    this.Data = (
     from string line2D 
     in data.Split(new string[] { "@" }, StringSplitOptions.RemoveEmptyEntries) 
     select (
     from string line 
     in line2D.Split(new string[] { "^^" }, StringSplitOptions.RemoveEmptyEntries) 
     select line.Split(';') 
    ).ToArray() 
    ).ToArray(); 
} 
+0

() 'cal 엘. 좋은. – toddmo

+0

여전히 '내부'에서 컴파일되지 않습니다. " 'System.Collections.Generic.IEnumerable '에서 'int'"로 변환 할 수 없습니다. " – toddmo

1

나는 보통 .NET 프로젝트에서 대부분 동일한 공통 일반 확장으로 끝날 위해 작동 배열로 변환 : 다음

public static string[] splitR(this string str, params string[] separators) { 
    return str.Split(separators, StringSplitOptions.RemoveEmptyEntries); } 

public static O[] convert<I, O>(this I[] array, Converter<I, O> converter) { 
    return Array.ConvertAll(array, converter); } 

public static string joinT<T>(this T[] values, string separator) { 
    return string.Join(separator, values); } 

단지 :

string s = "1;2;3^^4;5;[email protected];4;4^^7;7;7"; 

string[][][] s3 = s.splitR("@").convert(x => x.splitR("^^").convert(y => y.splitR(";"))); 

string s0 = s3.convert(x => x.convert(y => y.joinT(";")).joinT("^^")).joinT("@"); 
+0

아카데미에서 벌컨 교습합니까? 이것은 세상에서 벗어난 것입니다. 나는 이것을 커피 위에서 공부해야 할 것입니다. 그것은 마치 뒤뜰에 착륙 한 우주선과 같습니다. 이 작업을 수행하고 생성자에서 차원을 사용하는 NDimensionalStringArray 클래스를 만들 수있는 것처럼 보입니다. – toddmo

+0

그것은 가능한 적은 줄에 코드를 맞추려고 노력하는 것이 저의 습관입니다. 스크롤을 덜하면서 더 많은 코드를 볼 수 있습니다.] 가변적 인 수의 구분 기호를 처리하기 위해 일종의 일반적인 재귀 함수를 생각하고 있었지만 산만 해졌고 몇 분 후. 나는 여러분의 가치 중 어느 것도 그 세 구분자 중 하나를 포함하지 않기를 희망합니다, 왜냐하면 그것은 약간의 문제 일 것이기 때문입니다. – Slai

관련 문제