Mat*_*ttH 3 linq collections linq-to-objects
我正在尝试使用LINQ To Objects创建一个查询,该查询将为我提供文件,由filename编制索引,并将值映射到其二进制数据byte[].
但是我找不到一个"整洁"的方法来做到这一点.我希望得到类似Dictionary<T,K>输出的东西.
这是我到目前为止所拥有的.示例delimFileNames ="1.jpg | 2.jpg"
//Extract filenames from filename string
//and read file binary from file
//select result into a filename indexed collection
var result = from f in delimFileNames.Split(Constants.DDS_FILENAME_SEPARATOR)
let filePath = Path.Combine(ddsClient.WorkingDirectory, f)
let fileData = File.ReadAllBytes(filePath)
select new KeyValuePair<string, byte[]>(f, fileData);
return result.ToDictionary(kvp => kvp.Key, kvp=> kvp.Value);
Run Code Online (Sandbox Code Playgroud)
主要的搔痒是为什么我不能使用无参数ToDictionary()或直接演员.任何改善上述内容的建议或替代方案均值得赞赏.
ToDictionary() 必须有一个特殊的KeyValuePair案例 - 你当然可以添加为你自己的扩展方法:
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(
IEnumerable<KeyValuePair<TKey, TValue>> source)
{
return source.ToDictionary(kvp => kvp.Key, kvp=> kvp.Value);
}
Run Code Online (Sandbox Code Playgroud)
没有这种扩展方法,你可以这样做:
var result = from f in delimFileNames.Split(Constants.DDS_FILENAME_SEPARATOR)
.ToDictionary(f => f,
// Outdented to avoid scrolling
f => File.ReadAllBytes(Path.Combine(ddsClient.WorkingDirectory, f));
Run Code Online (Sandbox Code Playgroud)
基本上,查询表达式允许您执行所有时髦的"let"操作,但强制您select最后使用,这使您将两个不同的值(键和字节数组)传播到两个属性中.
| 归档时间: |
|
| 查看次数: |
5809 次 |
| 最近记录: |