2014-04-06 2 views
0

f1.txt,f2.txt,....f15.txt과 같은 폴더에 텍스트 파일이 있습니다. 나는 2배열의 항목 조합을 모두 얻으십시오.

최종 결과는 내가

static IEnumerable<IEnumerable<T>> 
GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable 
{ 
     if (length == 1) return list.Select(t => new T[] { t }); 
     return GetKCombs(list, length - 1) 
      .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0), 
       (t1, t2) => t1.Concat(new T[] { t2 })); 
} 

그런 다음 코드를 사용 main 메소드에서 호출

{f1.txt, f2.txt}, {f1.txt, f3.txt}....

해야 길이가 이들의 조합을 얻으려면 .

string[] files = Directory.GetFiles(@"C:\Users\Downloads\Samples", "*.txt"); 
IEnumerable<IEnumerable<string>> filescombination = GetKCombs(files, 2); 

하지만 나는 아무 것도 얻지 못했습니까?

편집 : 직접 실행 창에

 foreach(var x in filescombination) 
     { 
      Console.WriteLine(x); 
     } 

, 우리는 '파일'당신이 기대하는 파일의 목록을 포함

?x 
      {System.Linq.Enumerable.ConcatIterator<string>} 
      first: null 
      second: null 
+0

는 당신이 실제로'x' 반복 봤어을? – svick

+0

예, Console.WriteLine (x) 다음에 "}"에 중단 점을 넣습니다. –

답변

0

마지막으로 코드에서 확인했습니다.

 foreach(var x in filescombination) 
     { 
      var y = x.ToList()[0] + ',' + x.ToList()[1]; 
     } 

x는

IEnumerable<string> 

을하기 때문에 우리는 같은 결과를 얻을 수 있습니다 :

 IEnumerable<IEnumerable<string>> filescombination = GetKCombs(files,2); 
     List<string> flist = new List<string>(); 
     foreach(var x in filescombination) 
     { 
      var y = x.ToList()[0] + ',' + x.ToList()[1]; 
      flist.Add(y); 
     } 
2

확인해야합니다.

이 메서드는 예상대로 작동합니다. 작은 테스트 애플 리케이션에 테스트 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<int> list = new List<int> { 1, 2, 3, 4 }; 

     IEnumerable<IEnumerable<int>> result = GetKCombs(list, 2); 

     foreach (var line in result) 
     { 
      foreach (var item in line) 
      { 
       Console.Write("{0}, ", item); 
      } 
      Console.WriteLine(); 
     } 

     Console.ReadKey(); 
    } 

    static IEnumerable<IEnumerable<T>> GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable 
    { 
     if (length == 1) return list.Select(t => new T[] { t }); 
     return GetKCombs(list, length - 1) 
      .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0), 
       (t1, t2) => t1.Concat(new T[] { t2 })); 
    } 
} 

편집 :

코드에서

당신은 : 당신이 Console.WriteLine을 수행 할 때

foreach(IEnumerable<string> x in filescombination) 
    { 
     Console.WriteLine(x); 
    } 

(X)는 Console.WriteLine과 동일입니다 (x.ToString()). ToString()의 기본 동작은 개체의 이름을 표시하는 것입니다.

디버그 모드에서 첫 번째로 얻는 이유는 null이고 두 번째 : 지연된 실행 때문입니다. IEnumerable 개체는 ToList() 또는 iterator와 같은 값을 실제로 사용하기 전까지 값이 무엇인지 알지 못합니다.

+0

아니요, 파일이 있습니다. 내 업데이트를 참조하십시오. –

+1

IEnumearble.ToString()에서 실제로 더 많은 정보를 볼 수 있기를 기대하고 있습니다. 내 예제처럼 foreach 코드를 변경하십시오. –

+0

아니요, 귀하의 코드를 사용했지만 "f1.txt"항목이 하나만 있습니다. –

관련 문제