2012-10-13 10 views
13

データグループから複数のファイルを生成するより効率的な方法が必要です。 私はList<MyObject>型を使用しています。私のオブジェクトにはデータをグループ化する必要のあるいくつかのパブリックプロパティがあります。C#Group by Linqとforeach

私はLinqについて聞いたことがあります。しかし、私はそれについてどうなるかわからない。

私はその後、TEXTファイルを構築するためにそれらにforeach表情を実行し、状態によってすべてMyObjects(人)をグループ化し、各状態のテキストファイルを作成する必要があります。

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

You def。ここで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++; 
     } 
    }