使用LINQ To Objects创建键/值集合

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()或直接演员.任何改善上述内容的建议或替代方案均值得赞赏.

Jon*_*eet 5

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最后使用,这使您将两个不同的值(键和字节数组)传播到两个属性中.