假设我们有一个包含以下值的输入列表(均为字符串):

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/

10-11 14:41