假设我在SQL中有一个表格如下:
record_id|user_id|Name |Meals
---------|-------|-----|-----
1 | 1 | Bob|1
2 | 2 |Sally|2
3 | 3 |Roger|2
4 | 1 | Bob|3
5 | 4 | Joan|1
6 | 2 |Sally|1
我想在C#中创建一个对象,它总结了多次出现的任何名字的用餐次数:
user_id| Name|Meals
-------|-----|-----
1 | Bob|4
2 |Sally|3
3 |Roger|2
4 | Joan|1
使问题复杂化的是,由于程序的性质,整个表必须一次性检索,而不是使用SQL语法来总结Bob和Sally的饭菜,然后在C#数据读取器中迭代,并且最后添加到IEnumerable数组。所以我需要一些类似的东西:
List<MyIEnumerable> MyList = new List<MyIEnumberable>();
while(dr.Read()) {
if(MyList.Contains(Convert.ToInt32(dr[1]))) {
// Needs to combine the dr record with the existing record in MyList
}
else {
MyIEnumerable PersonEntry = new MyIEnumerable();
PersonEntry.user_id = Convert.ToInt32(dr[1]);
PersonEntry.Name = dr[2].ToString();
PersonEntry.Meals = Convert.ToInt32(dr[3]);
MyList.Add(PersonEntry);
}
}
所以你可以看到我想要的逻辑。 .Contains
实际上并不适用于这种情况,但我需要类似的东西。
答案 0 :(得分:2)
您可以使用词典来实现此目的。
Dictionary<int, MyIEnumerable> MyDictionary = new Dictionary<int, MyIEnumerable>();
while (dr.Read()) {
int myKey = Convert.ToInt32(dr[1]));
if (MyDictionary.ContainsKey(myKey))
{
MyDictionary[myKey].Meals += Convert.ToInt32(dr[3]);
}
else
{
MyIEnumerable PersonEntry = new MyIEnumerable();
PersonEntry.user_id = Convert.ToInt32(dr[1]);
PersonEntry.Name = dr[2].ToString();
PersonEntry.Meals = Convert.ToInt32(dr[3]);
MyDictionary.Add(myKey), PersonEntry);
}
}
通过执行MyDictionary[id] = object
它将更新字典中的条目(如果已存在)或添加新条目。
如果您真的想要返回一个列表,那么您可以完成:
List<MyIEnumerable> MyList = MyDictionary.Select(kvp => kvp.Value).ToList();
答案 1 :(得分:0)
您不能sum
meals
'因为您将获得一个号码,但您可以按name
列分组,并获得一个表格,其中meals
已汇总:
select user_id, name, sum(meals)
from datatable
group by user_id, name, meals
order by user_id
但如果它不适合您的具体问题,您应该详细解释它。
如果您真的想在此上下文中使用.Contain()
,那么您只需在IEquatable<Part>
课程中实施MyEnumerable
here,您也可以看到group_leader() -> pid()
3}}