假设我们有一个包含以下值的输入列表(均为字符串):
var listA = new List<string>();
listA.Add("test");
listA.Add("123");
listA.Add("5.7");
我们还得到第二个列表:
var listB = new List<object>();
listB.Add(typeof(string));
listB.Add(typeof(int));
listB.Add(typeof(float));
我想通过将ListA中的所有值与ListB中的类型列表进行匹配来验证ListA中的所有值是否都采用正确的格式。两个列表的长度相同。
如果是,我想获得一个List作为返回值,其中ListA的所有值都以ListB中指定的格式存储。
如果一次转换失败,我希望能够引发一个自定义异常。就像是
throw new MyException($"Failed to convert value {valueX} to {type}");
我只能想象一个非常丑陋的解决方案,其中包含for循环,大量的强制转换/转换和复制。是否有一个优雅的解决方案?
最佳答案
您可以将Zip列表放在一起,然后使用Convert.ChangeType
方法
返回指定类型的对象,其值等于
指定的对象。
它将引发以下类型的异常InvalidCastException
不支持此转换。 -或-value为null,conversionType为值类型。 -或-值不
实现IConvertible接口。FormatException
值不是由conversionType识别的格式。OverflowException
值表示超出conversionType范围的数字。ArgumentNullException
conversionType为null。
例
var listA = new List<string> { "test", "123", "5.7" };
var listB = new List<Type> { typeof(string), typeof(int), typeof(int) };
var combined = listA.Zip(listB, (s, type) => (Value :s, Type:type));
foreach (var item in combined)
{
try
{
Convert.ChangeType(item.Value, item.Type);
}
catch (Exception ex)
{
throw new InvalidOperationException($"Failed to cast value {item.Value} to {item.Type}",ex);
}
}
Full Demo Here
小旁注:从技术上讲,这不是强制转换本身,而是更改/转换类型
关于c# - 使用LINQ将List <string>与List <object>匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56615363/