2012-10-13 2 views
13

내 데이터 그룹에서 여러 파일을 생성하는보다 효율적인 방법이 필요합니다. 메신저 List<MyObject> 형식을 사용하고 내 개체에 의해 데이터를 그룹화해야하는 일부 공용 속성이 있습니다.C# Groupby Linq 및 foreach

내가 들어 본 내용은 Linq이며 사용할 수있는 것 같습니다. 그러나 그것에 대해 어떻게 가야할지 모르겠다.

각 상태에 대한 텍스트 파일을 생성해야하므로 MyObjects (사람)을 상태별로 그룹화 한 다음 foreach을 실행하여 TEXT 파일을 작성하십시오.

void Main() 
{ 

    List<MyObject> lst = new List<MyObject>(); 
    lst.Add(new MyObject{ name = "bill", state = "nsw", url = "microsoft.com"}); 
    lst.Add(new MyObject{ name = "ted", state = "vic", url = "apple.com"}); 
    lst.Add(new MyObject{ name = "jesse", state = "nsw", url = "google.com"}); 
    lst.Add(new MyObject{ name = "james", state = "qld", url = "toshiba.com"}); 

    string builder = ""; 
    foreach (MyObject item in myObjects) { 

     builder += item.name + "\r\n"; 
     builder += item.url + "\r\n" + "\r\n\r\n"; 

    } 

and out to the `StreamWriter` will be the filenames by state. 

총 3 개의 파일이 필요합니다.

-nsw.txt 
-vic.txt 
-qld.txt 

답변

25

뭔가, 아마? 이상과 같은

var groups = lst.GroupBy(x => x.state); 

    foreach (var group in groups) 
    { 
     using (var f = new StreamWriter(group.Key + ".txt")) 
     { 
      foreach (var item in group) 
      { 
       f.WriteLine(item.name); 
       f.WriteLine(item.url); 
      } 
     } 
    } 
+0

여분의 빈 줄이 필요합니다. –

+0

나는 그것이 현재 익숙한 것이기 때문에 나는 이것을 좋아한다. 멋지고 읽기 쉽습니다. – IEnumerable

+0

Linq도 사용하고 있습니까? – IEnumerable

6

여기 LINQ를 사용할 수 있습니다.

lst.GroupBy(r=> r.state).ToList().ForEach(r=> { 
     //state= r.Key 
     // 

     foreach (var v in r) 
     { 

     } 
    }); 

linq에 관한 것. 당신이 그것에 뭔가를하는 방법을 알고 싶다면. "SQL에서이 작업을 수행하는 방법"을 생각하십시오. 키워드는 대부분 동일합니다.

+0

를 얻을 수있다, 나는 그것을 시도 할 것이다. 덕분에 – IEnumerable

0

뭔가 같은 ...

string builderNsw = ""; 
foreach (MyObject item in lst.Where(o=>o.state == 'nsw')) { 

    builderNsw += item.name + "\r\n"; 
    builderNsw += item.url + "\r\n" + "\r\n\r\n"; 

} 

...하지만이를 달성하기 위해 아마 여러 가지가 있습니다.

+0

네,하지만 이것은 "nsw"데이터 만 생성 할 것이라고 가정합니다. 모든 상태를 생성하는 깨끗한 솔루션이 필요합니다. – IEnumerable

1

당신은 실제로 LINQ와 전체 내용을 생성 할 수 있습니다 :이 같은

var entryFormat = "{1}{0}{2}{0}{0}{0}"; 
var groupsToPrint = lst 
    .GroupBy(p => p.state) 
    .Select(g => new 
    { 
     State = g.Key, 
     // produce file content on-the-fly from group entries 
     Content = string.Join("", g.Select(v => string.Format(entryFormat, 
      Environment.NewLine, v.name, v.url))) 
    }); 

var fileNameFormat = "{0}.txt"; 
foreach (var entry in groupsToPrint) 
{ 
    var fileName = string.Format(fileNameFormat, entry.State); 
    File.WriteAllText(fileName, entry.Content); 
} 
0

같은 - 그룹이 그룹을 통해 반복하는, 내가 유사성을 발견 않았다 :) 샘플은 매우 우아한 보이는 그룹 이름도

int itemCounter = 1; 
    IEnumerable<DataRow> sequence = Datatables.AsEnumerable(); 

    var GroupedData = from d in sequence group d by d["panelName"];  // GroupedData is now of type IEnumerable<IGrouping<int, Document>> 

    foreach (var GroupList in GroupedData) // GroupList = "document group", of type IGrouping<int, Document> 
    {   
     bool chk = false; 
     foreach (var Item in GroupList) 
     { 

     if (chk == false) // means when header is not inserted 
     { 
      var groupName = "Panel Name : " + Item["panelName"].ToString(); 

      chk = true; 
     } 
     var count = itemCounter.ToString(); 
     var itemRef = Item["reference"].ToString(); 

     itemCounter++; 
     } 
    }