Linq 中string转换为int 取得Max值和Mix值(利用ConvertAll转换)

本文详细介绍了在C#中如何使用多种方式将字符串数组转换为整数数组,并通过Max()方法获取最大值,包括ConvertAll、委托、匿名方法、Lambda表达式和集合扩展方法等技巧。

var  boxnum = "1,2,3,4,5,6,7,8,9,10,";

var ssd = boxnum.Split(',').Where(p => !string.IsNullOrEmpty(p.Trim())).Max(); 输出的是 9

我想获取这里面的最大值结果用 boxnum.Split(',').Max()得出的最大值是9.结果不对。 由于split后结果是生成是数组形式的数据,查询了下原因由于是字符串比较,9大于10,第一个字符为“1”.


split后结果是生成是数组形式的数据:

经过问我的笨哥还有查询解决方法如下:利用 来转换,


ConvertAll 将当前 List 中的元素转换为另一种类型,并返回包含转换后的元素的列表


publicList<TOutput> ConvertAll<TOutput> (Converter<T,TOutput> converter)

 

调用委托

System.Converter<TInput,TOutput>

publicdelegate TOutputConverter<TInput, TOutput>(TInput input);

将对象从一种类型转换为另一种类型的方法

 

  1. 将当前 List 中的元素转换为另一种类型,并返回包含转换后的元素的列表

 

标准委托

publicstaticvoid Main()

{

List<string> ls =newList<string>() {"1","2","3" };

 

//System.Converter<string, int> cw=new Converter<string,int>(stringToint);

//List<int> li = ls.ConvertAll<int>(cw);

 

List<int> li= ls.ConvertAll<int>(stringToint);

 

}

publicstaticint stringToint(string s)

{

returnint.Parse(s);

}

匿名方法

List<string> ls =newList<string>() {"1","2","3" };

List<int> li = ls.ConvertAll<int>(delegate(string s) { return int.Parse(s); });

Lambda表达式

List<string> ls =newList<string>() {"1","2","3" };

List<int> li = ls.ConvertAll<int>(i=>int.Parse(i));

集合扩展方法

List<string> ls =newList<string>() {"1","2","3" };

// System.Collections.Generic.IEnumerable<int> li = ls.Select(i => int.Parse(i)); ;

var li = ls.Select(i=>int.Parse(i));

 

  1. 将当前 List 中的元素值批量修改

staticvoid Main(string[] args)

{

List<string> ls =newList<string>() {"1","2","3" };

List<string> li = ls.ConvertAll<string >(stringAdd);

}

 

publicstaticstring stringAdd(string s)

{

return s+"wxd";

}

 

详细地址  http://www.cnblogs.com/foundation/archive/2009/01/05/1369371.html 感谢


var  boxnum = "1,2,3,4,5,6,7,8,9,10,";
        

方法一:
var test1 = boxnum.Split(',').Where(p=>!string.IsNullOrEmpty(p.Trim())).ToList().ConvertAll<int>(p => int.Parse(p));

取得数据为:


可以直接 test1.Max()或者

var test1 = boxnum.Split(',').Where(p=>!string.IsNullOrEmpty(p.Trim())).ToList().ConvertAll<int>(p => int.Parse(p)).Max();

结果response:10

方法二:
 List<int> result = new List<string>(boxnum.Split(',').Where(p => !string.IsNullOrEmpty(p.Trim()))).ConvertAll(i => int.Parse(i));

取得数据效果图和方法一一样。就不贴图了

resulut.Max() =》response:10


方法三:

	int max = 0;
			var rtn = from b in
						  (from a in boxnum.Split(',')
						   where !string.IsNullOrEmpty(a.Trim())
						   select new { IsInt = int.TryParse(a, out max), Str = a })
					  where b.IsInt
					  select int.Parse(b.Str);

resulut.Max() =》response:10

补充老曹给的例子:

方法四:

var ssss = boxnum.Split(',').Where(p => !string.IsNullOrEmpty(p.Trim())).Select(x => int.Parse(x)).Max();

输出10

方法五:
 var sdd = boxnum.Split(',').Where(p => !string.IsNullOrEmpty(p.Trim())).OrderBy(x => x.Length).ThenBy(x => x).First(); =>Last();

First() 输出最小值 1

Last() 输出最大值10

以上5种方法如果出现 数字以外的字符,那样写法就会报错的。则可以使用OfType<T>()

PS:

如果object数组中有整数和字符串,现在想找出其中最大的数则用【OfType<T>():用来将序列中可以转换的转换为指定的序列】

object[] test= {1,233,4,5,555,"cc","dff" };
 int max=test.OfType<int>().Max();

//获取从数据库中取出的数据(假设只有一条记录) DataTable的话则用【Cast<T>()用来将非泛型的序列转换为泛型的序列】

DataTable dt=new DataTable();

DataRow row=dt.Rows.Cast<DataRow>().Single();




<think>好的,我现在需要解决用户在C#中将字符串转换为整数时遇到的隐式转换错误的问题。首先,我应该回忆一下C#中的类型转换机制。用户提到隐式转换错误,这意味着他们可能尝试直接赋,比如string s = "123"; int i = s;,这在C#中是不允许的,因为stringint之间没有隐式转换。 接下来,我应该考虑正确的转换方法。常见的转换方式有几种:Convert.ToInt32、int.Parseint.TryParse。这些方法各有优缺点。Convert.ToInt32可以处理null,返回0;int.Parse会抛出异常如果字符串格式不正确;而int.TryParse则更安全,返回布尔表示是否成功,避免异常。 然后,我需要查看用户提供的引用内容。引用3提到使用is操作符进行类型检查,但这里的问题是从stringint,而不是对象类型转换。引用24讨论了数组转换类型不匹配的问题,可能与当前问题关联不大,但引用2中的Cast方法可能不适用于stringint转换,因为它们是不同的类型,需要显式转换。 用户可能遇到的错误示例,比如直接赋导致的错误,需要明确指出问题所在,并建议使用上述方法。此外,还需要提醒用户处理转换失败的情况,尤其是使用TryParse来避免程序崩溃。 还要考虑其他可能性,比如用户是否在尝试将字符串转换为可空整数(int?),这时可能需要使用不同的方法。此外,隐式转换的其他场景,比如在LINQ查询或数组中,可能需要显式转换每个元素。 最后,应该总结推荐的解决方案,分步骤说明每种方法的适用场景,并给出代码示例,帮助用户理解如何正确实现转换。同时,生成相关问题,帮助用户深入理解类型转换的其他方面。</think>在C#中解决字符串到整数的隐式转换错误,需明确采用显式转换方法。以下是具体解决方案: ### 分步解决方案 1. **显式转换方法** - 使用`Convert.ToInt32()`: ```csharp string input = "123"; int number = Convert.ToInt32(input); // 转换失败会抛出异常 ``` 此方法支持处理`null`(将`null`转为0),但非数字字符串会触发`FormatException`[^3]。 2. **安全转换方法** - 使用`int.TryParse()`避免异常: ```csharp string input = "abc"; if(int.TryParse(input, out int result)) { Console.WriteLine(result); } else { Console.WriteLine("转换失败"); } ``` 此方法推荐用于用户输入等不可控场景,通过布尔返回判断结果有效性。 3. **强制转换场景** - 若涉及对象类型需先验证: ```csharp object obj = "456"; if(obj is int) { int n = (int)obj; // 此路径不会执行,因obj实际是string类型 } else if(obj is string str && int.TryParse(str, out int val)) { Console.WriteLine(val); // 输出456 } ``` 通过`is`操作符验证类型后,再结合安全转换[^3]。 4. **集合元素转换** - 使用LINQ的`Select`处理集合: ```csharp string[] strArray = {"1", "2", "3"}; int[] intArray = strArray.Select(s => int.Parse(s)).ToArray(); ``` 或添加安全验证: ```csharp var validNumbers = strArray.Where(s => int.TryParse(s, out _)).Select(int.Parse); ``` ### 错误示例分析 ```csharp string text = "123"; int num = text; // 编译错误:无法隐式转换stringint ``` 必须改为显式转换: ```csharp int num = int.Parse(text); // 或使用Convert/TryParse ``` ### 进阶建议 - **自定义转换器**:实现`IConvertible`接口处理复杂格式 - **全球化处理**:使用`CultureInfo`应对不同数字格式(如千位分隔符) - **性能优化**:高频场景优先使用`TryParse`避免异常开销
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值