Pat*_*ick 0 .net c# linq generics
我有一个通用词典,其中TValue是type String(Dictionary<int, string>).我选择使用字符串作为值类型,因为数据是从Xml文件加载的,其中源值可以是字符或数字数据类型(我想Object也是可接受的TValue类型,但即使这样,这个问题也同样如此适用).
字符数据类型也很重要,因此不能直接排除它们.
我想提取一部分内容Dictionary<int, double>.换句话说,我想要字典的子集,其中值是数字.
现在我这样做:
Dictionary<int, string> myDictionary;
// Do some loading.
var numericData = myDictionary.Where(kvp => Double.TryParse(kvp.Value, out temp)
Run Code Online (Sandbox Code Playgroud)
这种方法非常难看,并没有让我得到结果,Dictionary<int, double>任何人都可以提供其他方法来改善这一点吗?
谢谢!
你给出的代码不仅丑陋 - 它会InvalidCastException在执行时失败.我怀疑你真的想要:
var numericData = myDictionary
.Select(kvp => {
double value;
return new { kvp.Key,
Value = double.TryParse(kvp.Value, out value)
? value : (double?) null
};
})
.Where(pair => pair.Value != null)
.ToDictionary(pair => pair.Key, pair => pair.Value.Value);
Run Code Online (Sandbox Code Playgroud)
是的,这很难看 - 但是:
如果您乐意解析两次,可以使它更清晰但效率更低:
var numericData = myDictionary
.Where(kvp => { double tmp; return double.TryParse(kvp.Value, out tmp); })
.ToDictionary(pair => pair.Key, pair => double.Parse(pair.Value));
Run Code Online (Sandbox Code Playgroud)
或者(更干净地)你可以创建一个单独的方法:
public static double? TryParseNullableDouble(string text)
{
double value;
return double.TryParse(text, out value) ? value : (double?) null;
}
Run Code Online (Sandbox Code Playgroud)
然后第一个版本变为:
var numericData = myDictionary
.Select(kvp => new { kvp.Key, TryParseNullableDouble(kvp.Value) })
.Where(pair => pair.Value != null)
.ToDictionary(pair => pair.Key, pair => pair.Value.Value);
Run Code Online (Sandbox Code Playgroud)