Jamie888 Ответов: 2

Как посчитать число, где есть одно и то же условие


Привет, у меня есть 2 столбца, возвращенные из базы данных следующим образом:
Name Country
-----------------
John  Australia
Jenny Australia
Bob   Japan


Я хочу подсчитать количество людей, приезжающих из одной и той же страны, используя C#, но я не смог этого сделать. Я использую цикл for, но счетчик всегда будет давать мне 1 для каждой строки.
Мой предполагаемый результат должен выглядеть так:
Name Country     Count
----------------------
John  Australia    2
Jenny Australia    2
Bob   Japan        1



Мои текущие коды следующие:
foreach (TravellerModel travellerModel in travellerModelList.ModelList)
{
travellerModel.PersonCount = travellerModelList.ModelList.GroupBy(x => x.Country).Count();
}


Но конечный результат всегда будет следующим:
Name Country     Count
----------------------
John  Australia    1
Jenny Australia    1
Bob   Japan        1


Любая помощь будет очень признательна. Спасибо.

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

1. исследуйте онлайн, но не смогли найти ни одного, так как я не знаю, какое ключевое слово я должен использовать.

2 Ответов

Рейтинг:
2

Vijay Ahlawat

Лучший способ сделать это-использовать базу данных, например

select Name,Country,count(*) No_of_times from table group by Name,Country


В C# вам нужно сделать это, используя 2 цикла.
Один для основной таблицы, а другой только для отдельных столбцов.
DataTable dt = new DataTable();
DataTable dt_old = new DataTable();
dt = dt_old.DefaultView.ToTable(true, "Name", "Country");
dt.Columns.Add("Count", typeof(int));
foreach (DataRow r in dt.Rows)
{
    DataTable dt_temp = new DataTable();
    dt_old.DefaultView.RowFilter = "Name='" + r["Name"] + "' AND Country='" + r["Country"] + "'";
    dt_temp = dt.DefaultView.ToTable();
    r["Count"] = dt_temp.Rows.Count;
}
Hope this will help you.


Maciej Los

Извините, но первая часть вашего ответа неверна.
Обратите внимание, что имя уникально, поэтому вы получите count: {1, 1, 1}.

Рейтинг:
12

Maciej Los

Проверить это:

void Main()
{
	List<TravellerModel> tms = new List<TravellerModel>()
	{
		new TravellerModel(){Name = "John", Country = "Australia"},
		new TravellerModel(){Name = "Jenny", Country = "Australia"},
		new TravellerModel(){Name = "Bob", Country = "Japan"}
	};
	
	//solution #1  
	var result = tms.GroupBy(x=>x.Country)
		.SelectMany(grp=> grp.Select(y=> new
		{
			Name = y.Name,
			Country = y.Country,
			Count = grp.Count()
		}))
		.ToList();
	foreach(var r in result)
	{
		Console.WriteLine($"{r.Name} {r.Country} {r.Count}");
	}


	//solution #2
	foreach(TravellerModel tm in tms)
	{
		int cnt  = tms.Where(x=>x.Country==tm.Country).Count();
		Console.WriteLine($"{tm.Name} {tm.Country} {cnt}");
	}

	
}

// Define other methods and classes here
class TravellerModel
{
	public string Name { get; set; }
	public string Country { get; set; }
}