С# Groupby Linq и foreach
Мне нужен более эффективный способ создания нескольких файлов из моей группы данных.
Im, использующий тип List<MyObject>
, и мой объект имеет некоторые общедоступные свойства, в которых мне нужно сгруппировать данные.
Я слышал о Linq, и это звучит как что-то, что я мог бы использовать. Однако я не уверен, как это сделать.
Мне нужно создать текстовый файл для каждого STATE, поэтому группируем все 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
Ответы
Ответ 1
Что-то вроде этого, возможно?
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);
}
}
}
Ответ 2
Вы определите. может использовать LINQ здесь.
lst.GroupBy(r=> r.state).ToList().ForEach(r=> {
//state= r.Key
//
foreach (var v in r)
{
}
});
Вещь о linq. Если вы хотите знать, как что-то сделать в нем. Подумайте, "как бы это сделать в SQL". Ключевые слова по большей части одинаковы.
Ответ 3
Фактически вы можете создать весь контент с помощью 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);
}
Ответ 4
Что-то вроде...
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";
}
... но, вероятно, есть много способов добиться этого.
Ответ 5
То же, что и выше - Итерация по группам по группам, также может иметь название группы
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++;
}
}