2012-10-13 38 views
13

Tôi cần một cách hiệu quả hơn để sản xuất nhiều tệp từ nhóm dữ liệu của mình. Im sử dụng loại List<MyObject> và đối tượng của tôi có một số thuộc tính công khai mà tôi cần nhóm dữ liệu theo.C# Groupby Linq và foreach

Tôi đã nghe nói về Linq và có vẻ như tôi có thể sử dụng. Tuy nhiên Im không chắc chắn làm thế nào để đi về nó.

Tôi cần tạo tệp văn bản cho mỗi STATE, do đó, nhóm tất cả các MyObjects (mọi người) theo tiểu bang, sau đó chạy một số foreach xem chúng để tạo tệp 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. 

Tổng số dữ liệu trên tôi cần 3 tệp;

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

Trả lời

25

Something như thế này, có lẽ?

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

Cần thêm một dòng trống. –

+0

Tôi thích điều này vì nhiều hơn những gì Im hiện đang sử dụng. Đẹp và dễ đọc. – IEnumerable

+0

Đây có phải là sử dụng LINQ không? – IEnumerable

6

Bạn def. có thể sử dụng LINQ tại đây.

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

     foreach (var v in r) 
     { 

     } 
    }); 

Điều về LINQ. Nếu bạn muốn biết cách làm điều gì đó trong đó. Hãy suy nghĩ "làm thế nào tôi sẽ làm điều này trong SQL". Các từ khóa là phần lớn giống nhau.

+0

tôi đã nhận thấy những điểm tương đồng :) mẫu của bạn trông rất thanh lịch, tôi sẽ thử nó. cảm ơn – IEnumerable

0

Cái gì đó như ...

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

} 

... nhưng có lẽ nhiều cách để đạt được điều này.

+0

có nhưng tôi cho rằng điều này sẽ chỉ tạo ra dữ liệu "nsw", tôi cần một giải pháp sạch sẽ tạo ra tất cả các trạng thái – IEnumerable

1

Bạn thực sự có thể sản xuất toàn bộ nội dung với 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

tương tự như trên - Iterating thông qua các nhóm theo nhóm, có thể nhận được tên nhóm cũng

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++; 
     } 
    } 
Các vấn đề liên quan