从linq C#中的对象列表中获取和

彩信

我有如下所述的对象列表:

List<Maths> mObjs = new List<Maths>();
mObjs.Add(new Maths{ Name = "Jack", M1 = 10, M2 = 5, M3 = 0, M4 = 2, M5 =1 });
mObjs.Add(new Maths { Name = "Jill", M1 = 2, M2 = 3, M3 = 4, M4 = 1, M5 = 0 });
mObjs.Add(new Maths { Name = "Michel", M1 = 12, M2 = 15, M3 = 10, M4 = 12, M5 = 11 });

现在,我需要计算所有三个人的总和。我需要得到以下结果,可能是另一门新课

List<Results> mRes = new List<Results>();

public class Results{
    public string Name { get; set; }
    public int TotalValue { get; set; }

}

mRes.Name = "M1"
mRes.TotalValue  = 24;

mRes.Name = "M2"
mRes.TotalValue  = 23;

mRes.Name = "M3"
mRes.TotalValue  = 14;

mRes.Name = "M4"
mRes.TotalValue  = 15;


mRes.Name = "M5"
mRes.TotalValue  = 12;

如何使用linq查询从mObjs中获取此数据?我知道我们可以使用for来做到这一点,但是想知道是否有更好的方法可以使用linq查询来实现,因为这减少了代码行,而且我在许多其他地方也有类似的要求,并且不想写foreach或fors的数量每次。

鲍勃·维尔

您可以使用预选列表来列出名称和要选择的字段

var lookups = new Dictionary<string,Func<Maths,int>> {
    {"M1", x => x.M1 },
    {"M2", x => x.M2 },
    {"M3", x => x.M3 },
    {"M4", x => x.M4 },
    {"M5", x => x.M5 },
};

那你就可以做

var mRes = dlookups.Select(x => new Results { 
                                              Name= x.Key,
                                              TotalValue = mObjs.Sum(x.Value)
                           }).ToList();

开始更新*

回应评论

lambda表达式只是从源类到int的函数。

例如

class Sub1 {
  string M3 {get;set;}
  int M4 {get;set;}
}

class Math2 {
  string Name {get;set;}
  string M1 {get;set;}
  string M2 {get;set;}
  Sub1 Sub {get;set;}
}

var lookups = new Dictionary<string,Func<Math2,int>> {
   { "M1", x => int.Parse(x.M1) },
   { "M2", x => int.Parse(x.M2) },
   { "M3", x => int.Parse(x.Sub.M3) },
   { "M4", x => int.Parse(x.Sub.M4} }
};

或者,如果您想进行一些错误检查,则可以使用函数或嵌入代码。

int GetInt(string source) {
  if (source == null) return 0;
  int result;
  return int.TryParse(source, out result) ? result : 0;
}

var lookups = new Dictionary<string,Func<Math2,int>> {
   { "M1", x => {
                  int result;
                  return x == null ? 0 : (int.TryParse(x,out result) ? result : 0);
                },
   { "M2", x => GetInt(x) },
   { "M3", x => x.Sub == null ? 0 : GetInt(x.Sub.M3) },
   { "M4", x => x.Sub == null ? 0 : x.Sub.M4}
};

结束更新

如果您想走得更远,可以使用反射来构建查找字典。

这是一个帮助程序函数,它将为类的所有Integer属性生成查找。

public Dictionary<string,Func<T,int>> GenerateLookups<T>() where T: class {
    // This just looks for int properties, you could add your own filter
var properties = typeof(T).GetProperties().Where(pi => pi.PropertyType == typeof(int));

var parameter = Expression.Parameter(typeof(T));

  return properties.Select(x => new { 
     Key = x.Name, 
     Value = Expression.Lambda<Func<T,int>>(Expression.Property(parameter,x),parameter).Compile()
  }).ToDictionary (x => x.Key, x => x.Value);

}

现在您可以执行以下操作:

 var mRes=GenerateLookups<Maths>().Select( x => new Results
   {
     Name = x.Key,
     TotalValue = mObjs.Sum(x.Value)
   }).ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

c#使用Linq更新列表中的对象

来自分类Dev

使用Linq获取列表中对象的索引

来自分类Dev

通过LINQ +条件从数组中获取C#列表

来自分类Dev

Linq代码从列表中的对象获取数组中对象的索引

来自分类Dev

Linq查询以从列表列表中获取对象

来自分类Dev

使用LINQ从对象列表中获取不同的参数列表

来自分类Dev

从 C# 或 LINQ 列表中过滤

来自分类Dev

LINQ to XML在C#中创建对象

来自分类Dev

C# LINQ 在单次执行中从列表中删除多个对象

来自分类Dev

在 Linq 中获取常用列表

来自分类Dev

C#中的LINQ:LINQ中的Foreach

来自分类Dev

C#中的LINQ:LINQ中的Foreach

来自分类Dev

Linq在C#中的列表内添加列表

来自分类Dev

C#对象列表过滤(Linq?)

来自分类Dev

使用Linq获取列表中的月份和年份

来自分类Dev

Linq-根据“重量”和“顺序”从列表中获取项目

来自分类Dev

Linq根据文件名C#通过升序从目录中获取文件列表

来自分类Dev

(C# Linq) 当您的 ID 在另一个列表中时从列表中获取项目

来自分类Dev

从Linq中的列表获取子列表

来自分类Dev

Linq从嵌套列表中获取不同的列表

来自分类Dev

连接数据表和集合并在LINQ C#中返回列表

来自分类Dev

有什么办法可以在linq和c#中获取更新日期?

来自分类Dev

C#Linq GroupBy,获取每个组中的列的列表

来自分类Dev

C#LINQ从列表中获取重复项

来自分类Dev

在C#中优化Linq

来自分类Dev

使用LINQ在C#中订购列表清单

来自分类Dev

在C#中通过LINQ比较两个列表?

来自分类Dev

基于if语句的linq列表中的C#返回值

来自分类Dev

将Linq查询存储在列表C#中