非字典值可枚举

时间:2014-08-19 17:11:48

标签: c#

我需要存储一个<string, byte[]>对来创建zip文件(我执行一个异步下载函数,它返回文件的字节数组,我从解析URL得到文件名)

到目前为止,我一直在使用字典进行测试,但我知道最终我们还需要其他东西,因为文件名不是唯一的。

我确定我遗漏了一些简单的东西,但我不能为我的生活想到一个存储非唯一<TValue, TValue>对的Enumerable对象集合。

代码示例

public async Task<ZipFile> CreateZipFormUrls(List<string> urlList)
{
    using (var zip = new ZipFile())
    {
        var files = await ReturnFileDataAsync(urlList);
        foreach (var file in files)
        {
            var e = zip.AddEntry(file.Key, file.Value);
        }

        return zip;
    }
}

async Task<Dictionary<string, byte[]>> ReturnFileDataAsync(IEnumerable<string> urls)
{
    using (var client = new HttpClient())
    {
        var results = await Task.WhenAll(urls.Select(async url => new
        {
            Key = Path.GetFileName(url),
            Value = await client.GetByteArrayAsync(url),
        }));
        return results.ToDictionary(x => x.Key, x => x.Value);
    }
}

1 个答案:

答案 0 :(得分:3)

您可以使用List<Tuple<string, byte[]>> ...或者我个人强烈考虑为此创建自定义类 - 然后只列出它们。

使用自定义类而不是Tuple的优势在于,您可以为属性提供合理的名称 - 并且可能会添加类似于为数据返回Stream的方法。

我会在这里使用KeyValuePair,除非该字符串确实是一个关键字。如果这些名字不是唯一的,那么它们听起来就像是我的钥匙。