本文整理汇总了C#中IReadOnlyList.ToLookup方法的典型用法代码示例。如果您正苦于以下问题:C# IReadOnlyList.ToLookup方法的具体用法?C# IReadOnlyList.ToLookup怎么用?C# IReadOnlyList.ToLookup使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IReadOnlyList
的用法示例。
在下文中一共展示了IReadOnlyList.ToLookup方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: OrderAndMapRules
static IReadOnlyDictionary<string, IReadOnlyList<Export<IStyleRule, StyleRuleMetadata>>> OrderAndMapRules(
IReadOnlyList<Export<IStyleRule, StyleRuleMetadata>> rules)
{
var languageRuleMap = new Dictionary<string, IReadOnlyList<Export<IStyleRule, StyleRuleMetadata>>>();
ILookup<string, Export<IStyleRule, StyleRuleMetadata>> languageRuleLookup =
rules.ToLookup(r => r.Metadata.LanguageName);
foreach (IGrouping<string, Export<IStyleRule, StyleRuleMetadata>> languageRules in languageRuleLookup)
{
var graph = new DirectedGraph<Export<IStyleRule, StyleRuleMetadata>>(languageRules);
Dictionary<string, Export<IStyleRule, StyleRuleMetadata>> nameRuleMap =
languageRules.ToDictionary(r => r.Metadata.Name);
foreach (Export<IStyleRule, StyleRuleMetadata> languageRule in languageRules)
{
foreach (string afterName in languageRule.Metadata.AfterNames)
{
Export<IStyleRule, StyleRuleMetadata> afterRule;
if (nameRuleMap.TryGetValue(afterName, out afterRule))
{
graph.AddEdge(afterRule, languageRule);
}
}
foreach (string beforeName in languageRule.Metadata.BeforeNames)
{
Export<IStyleRule, StyleRuleMetadata> beforeRule;
if (nameRuleMap.TryGetValue(beforeName, out beforeRule))
{
graph.AddEdge(languageRule, beforeRule);
}
}
}
IReadOnlyList<Export<IStyleRule, StyleRuleMetadata>> cycle = graph.FindCycle();
if (cycle.Count > 0)
{
var ruleNames = String.Join(", ", cycle.Select(r => r.Metadata.Name));
throw new InvalidOperationException($"Dependency cycle exists in rules {ruleNames}");
}
languageRuleMap.Add(languageRules.Key, graph.Sort());
}
return languageRuleMap;
}
示例2: OnExtractionSuccess
public override void OnExtractionSuccess(string filePath, IReadOnlyList<Directory> directories, string relativePath, TextWriter log)
{
base.OnExtractionSuccess(filePath, directories, relativePath, log);
try
{
using (var writer = OpenWriter(filePath))
{
try
{
// Write any errors
if (directories.Any(d => d.HasError))
{
foreach (var directory in directories)
{
if (!directory.HasError)
continue;
foreach (var error in directory.Errors)
writer.Write("[ERROR: {0}] {1}\n", directory.Name, error);
}
writer.Write('\n');
}
// Write tag values for each directory
foreach (var directory in directories)
{
var directoryName = directory.Name;
foreach (var tag in directory.Tags)
{
var tagName = tag.Name;
var description = tag.Description;
if (directory is FileMetadataDirectory && tag.Type == FileMetadataDirectory.TagFileModifiedDate)
description = "<omitted for regression testing as checkout dependent>";
writer.Write("[{0} - 0x{1:x4}] {2} = {3}\n",
directoryName, tag.Type, tagName, description);
}
if (directory.TagCount != 0)
writer.Write('\n');
var xmpDirectory = directory as XmpDirectory;
if (xmpDirectory?.XmpMeta != null)
{
var wrote = false;
foreach (var prop in xmpDirectory.XmpMeta.Properties)
{
writer.WriteLine($"[XMPMeta - {prop.Namespace}] {prop.Path} = {prop.Value}");
wrote = true;
}
if (wrote)
writer.Write('\n');
}
}
// Write file structure
var tree = directories.ToLookup(d => d.Parent);
const int indent = 4;
Action<Directory, int> writeLevel = null;
writeLevel = (parent, level) =>
{
foreach (var child in tree[parent])
{
writer.Write(new string(' ', level*indent));
writer.Write($"- {child.Name}\n");
writeLevel(child, level + 1);
}
};
writeLevel(null, 0);
writer.Write('\n');
}
finally
{
writer.Write("Generated using metadata-extractor\n");
writer.Write("https://drewnoakes.com/code/exif/\n");
}
}
}
catch (Exception e)
{
log.Write("Exception after extraction: {0}\n", e.Message);
}
}