本文整理汇总了C#中IGrouping.ToLookup方法的典型用法代码示例。如果您正苦于以下问题:C# IGrouping.ToLookup方法的具体用法?C# IGrouping.ToLookup怎么用?C# IGrouping.ToLookup使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IGrouping
的用法示例。
在下文中一共展示了IGrouping.ToLookup方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: SolveNameClash
/// <summary>
/// From types with the same Name, create new names progressively
/// using FullName to disambiguate.
/// </summary>
/// <param name="pNameClash">Grouping with clashing name and types
/// that clash.</param>
/// <returns></returns>
private static Dictionary<string, string[]> SolveNameClash(IGrouping<string, Type> pNameClash)
{
// Create lookup from FullName to types.
var lFullNameLookup = pNameClash.ToLookup(lType => lType.FullName);
// See if there is any duplicated FullName (should never happen).
List<string> lDuplicatedFullName = lFullNameLookup
.Where(lTypes => lTypes.Count() > 1)
.Select(lTypes => lTypes.First().FullName)
.ToList();
if (lDuplicatedFullName.Any())
{
throw new SystemException("Found classes with same FullName: " + String.Join(", ", lDuplicatedFullName) + ".");
}
// Create lists for clashing types, indexes indicating when the
// FullNames differentiate and lists of 'sections' of FullName
// reversed.
List<Type> lClashTypes = lFullNameLookup.Select(lGroup => lGroup.First()).ToList();
List<int> lDiffIndex = lClashTypes.Select(lType => -1).ToList();
List<List<string>> lFullNames = lClashTypes.Select(lType => lType.FullName.Split('.').Reverse().ToList()).ToList();
// Loop through FullName 'sections' until exhaustion of the longest.
int lMax = lFullNames.Select(lStrings => lStrings.Count()).Max();
for (int i = 0; i < lMax; i++)
{
// Loop through all clashing types.
for (int j = 0; j < lClashTypes.Count(); j++)
{
// Skip types already differentiated.
if (lDiffIndex[j] != -1) continue;
string current = lFullNames[j][i];
// Assume it will differentiate.
bool lDiffed = true;
// Loop through all other clashing types to see if
// this is different from others at this index.
for (int k = 0; k < lClashTypes.Count(); k++)
{
if (k == j) continue;
if ((lDiffIndex[k] == -1) && (i < lFullNames[k].Count()) && (lFullNames[k][i].Equals(current)))
{
lDiffed = false;
break;
}
}
// Store index of differentiation.
if (lDiffed) lDiffIndex[j] = i;
}
}
// Create a dictionary with Reversed full names until differentiation.
Dictionary<string, string[]> lResult = new Dictionary<string, string[]>();
for (int i = 0; i < lClashTypes.Count(); i++)
{
// Unreverse the list using only needed items.
lFullNames[i] = lFullNames[i].Take(lDiffIndex[i] + 1).ToList();
lFullNames[i].Reverse();
lResult[lClashTypes[i].FullName] = lFullNames[i].ToArray();
}
return lResult;
}