DGKumar Ответов: 1

Как составить список элементов из набора данных с помощью group by


I have a dataset like below that i need to bind the below classes

SNo Name
1 	A
2	B
3	S
3	Sq
4	IO
4	89

Output should be like below
SMDetails
{
  F1{get;set;}
  F2{get;set;}
  SDetails[]{get;set;}
}
SDetails
{
	SNo {get;set;}
	Name {get;set;}
}


SDetails
	SNo		1
		Name A
	SNo		2
		Name B
		Name S
		Name S
	SNo		3
	
		Name s
		Name sq
	SNo 
		Name IO
		Name 89
		
		
		
   It getting duplicate lit items could you please help me how to get group by list items 


Что я уже пробовал:

I have tried 
		List<SMDetails> objSDetails=new List<SMDetails>(); 
		foreach(DataRow dr in dataset.Tables[0])
		{
			SMDetails objSMDetails=new SMDetails();
			objSMDetails.F1
			objSMDetails.F2
			objSMDetails.SDetails =List<SDetails>;
		   SMDetails.Add(objSMDetails);
		}
		
   It getting duplicate lit items could you please help me how to get group by list items 

Richard MacCutchan

Сначала вам нужно отсортировать свои данные, чтобы элементы были сгруппированы вместе в необходимые наборы. Кроме того, если вы знаете LINQ, то можете использовать Перечислимый.Метод GroupBy (System.Linq) | Microsoft Docs[^].

1 Ответов

Рейтинг:
0

Maciej Los

Если я вас хорошо понимаю...

Вам нужно изменить определение ваших классов:

public class SMDetails
{
	public string F1 {get; set;}
	public string F2 {get; set;}
	public List<SDetail> SDetails {get; set;}

}

public class SDetail
{
	public int SNo {get; set;}
	public List<string> Names {get; set;}
}

Затем...
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
    {
        new DataColumn("SNo", typeof(int)),
        new DataColumn("Name", typeof(string))
    });
dt.Rows.Add(new object[]{1, "A"});
dt.Rows.Add(new object[]{2, "B"});
dt.Rows.Add(new object[]{3, "S"});
dt.Rows.Add(new object[]{3, "Sq"});
dt.Rows.Add(new object[]{4, "IO"});
dt.Rows.Add(new object[]{4, "89"});

SMDetails smd = new SMDetails();
smd.F1 = "Some Info...";
smd.F2 = "Some other info...";
smd.SDetails = dt.AsEnumerable()
    .GroupBy(x=>x.Field<int>("SNo"))
    .Select(grp=>new SDetail()
        {
            SNo = grp.Key,
            Names = grp.Select(y=>y.Field<string>("Name")).ToList()
        })
    .ToList();

foreach(SDetail sd in smd.SDetails)
{
    Console.WriteLine("SNo {0}", sd.SNo);
    foreach(var si in sd.Names)
        Console.WriteLine("\tName {0}", si);
}


Результат:
SNo 1
  Name A
SNo 2
  Name B
SNo 3
  Name S
  Name Sq
SNo 4
  Name IO
  Name 89