如何在代码中找到总和整数?
List<object> lst = new List<object> { "c#", 12, "Simi", 236.5, 17, "Asp.net", 98 };
lst.Where(c => c is int).ToList().Sum();
lst.Where(c => c is string).ToList().Max(d => d.ToString().Length);
答案 0 :(得分:8)
我建议更改:
lst.Where(c => c is int).ToList().Sum();
收件人:
var sum = lst.OfType<int>().Sum();
{OfType<int>
将确保仅考虑整数(例如,字符串将被忽略),而Sum
将对其求和。
答案 1 :(得分:1)
您可以这样做
lst.Sum(c => c is int ? (int)c : 0)
答案 2 :(得分:0)
尽管提供的其他答案足够有效,但我想提供一个详尽的答案,以帮助您获得不仅仅是当前C#语法水平的帮助。例如; Linq
无法使用prior to 3.5。
IS
关键字
检查对象是否与给定类型兼容,或者(从C# 7.0开始)针对模式测试表达式。
LINQ
LINQ引入的许多概念最初都是在Microsoft的Cω研究项目中进行测试的。 LINQ于2007年11月19日作为.NET Framework 3.5的主要部分发布。
原始金额
一次完成所有操作的原始版本将是编写一个返回double
值但接受List<object>
值的方法。我之所以选择double
是因为它的±5 * 10^-324 - ±1.7 * 10^308最大范围非常之大。 double
类型能够实现所提供的所有值的总和,并且可以减少但不会消除发生溢出的风险。甚至double
都有最小值和最大值。我试图解释这个问题;但是,我所能做的就是让异常回溯到实现中。
public double SumNumericsFromListOfObjects(List<object> objects) {
double sum = 0;
foreach (object o in objects) {
double val = 0;
if (double.TryParse(o.ToString(), out val)
sum += val;
}
return sum;
}
// Usage:
private void DoSomeCoolStuff() {
List<object> myObjects = new List<object>();
object[] objects = new object[] { 12, 32, 1, 9, "5", "18", 3.14, "9.9", false };
myObjects.AddRange(objects);
double sumOfObjects = SumNumericsFromListOfObjects(myObjects);
int iSum = 0;
long lSum = 0;
if (sumOfObjects < int.MaxValue)
iSum = (int)sumOfObjects;
else if (sumOfObjects > int.MaxValue && sumOfObjects < long.MaxValue)
lSum = (long)sumOfObjects;
else
// You just have to use the double type at this point.
}
以上示例应处理对象列表中的大多数情况。授予原始职位明确指出,应该对类型为int
的对象进行求和,并且并未真正指定应考虑string
值还是double
值,也不应该指定如何处理它们。我个人认为最好处理所有案件。因此,由于string
的值如果满足特定条件就可以解析为double
的值,并且双精度数可以转换回整数(假设它们的值不超过int
的最大值),我决定在double
级别求和,然后在该方法的实现处转换回整数,以确保不会遗漏任何数值。上面的方法应该能够处理以下types:
byte
:0-255
sbyte
:-128-127
short
:-32768-32767
ushort
:0-65535
int
:-2147483648-2147483647
uint
:0-4294967295
long
:-9 * 10 ^ 18-9 * 10 ^ 18
ulong
:0-1.8 * 10 ^ 19
float
:±1.5 * 10 ^ -45-±3.4 * 10 ^ 38
double
:±5 * 10 ^ -324-±1.7 * 10 ^ 308
decimal
:±10 ^ -28-±7.9 * 10 ^ 28
扩展方法
如果您发现自己经常从对象列表中添加值,那么另一种快速而有效的方法是将extension methods添加到List<object>
类型。请记住,此方法还可能溢出执行该算法的类型的最小值和最大值。
internal class Extensions {
public static double Sum(this List<object> objects) {
double sum = 0;
foreach (object o in objects) {
double val = 0;
if (double.TryParse(o.ToString(), out val))
sum += val;
}
return sum;
}
}
// Usage:
double sum = myObjects.Sum();
如果有人觉得我遗漏了一些有用的信息,或者在这里做错了什么,请随时发表评论并通知我,以便我可以更新此帖子,以更好地教育未来的读者。