2012-10-13 28 views
13

Veri grubumdan daha fazla dosya üretmenin daha verimli bir yoluna ihtiyacım var. List<MyObject> türünü kullanıyorum ve nesneyi, verileri gruplandırmam gereken bazı genel özellikler var.C# Grupby Linq ve foreach

Linq duydum ve kullanabileceğim bir şey gibi geliyor. Ancak bunun hakkında nasıl gideceğimi bilmiyorum.

Her STATE için bir metin dosyası oluşturmam gerekiyor, bu nedenle tüm MyObjects (kişi) durumuna göre gruplandırılıyor, ardından bir TEXT dosyası oluşturmak için bir foreach çalıştırılıyor.

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. 

Yukarıdaki veriler için toplamda 3 dosyaya ihtiyacım var;

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

cevap

25

şey, belki? Above olarak

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

Fazladan bir boş satır gerekiyor. –

+0

Bunu beğendim çünkü şu an kullandığım şey. Güzel ve okunması kolay. – IEnumerable

+0

Linq de kullanıyor mu? – IEnumerable

6

You def. burada LINQ kullanabilir.

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

     foreach (var v in r) 
     { 

     } 
    }); 

linq. Eğer bir şeyleri nasıl yapacağını bilmek istiyorsan. "Bunu SQL'de nasıl yapardım" diye düşün. Anahtar kelimeler çoğunlukla aynıdır.

+0

alabilirsiniz bunu deneyecek. teşekkürler – IEnumerable

0

şey gibi ...

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"; 

} 

... ama bunu başarmak için muhtemelen birçok yolu vardır.

+0

evet ama bunun sadece "nsw" veri üreteceğini varsayalım, tüm eyaletleri üreten temiz bir çözüme ihtiyacım var – IEnumerable

1

Aslında LINQ ile tüm içeriği üretebilir: Böyle

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

Same - grup tarafından grupları aracılığıyla yineleme, ben benzerlikleri fark ettiniz :) senin örnek çok şık görünüyor grup adını da

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++; 
     } 
    }