C#代码优化GroupBy
C# Code Optimization GroupBy
我的以下代码有几个问题。
var groupedItems = inputFiles.GroupBy(q => q.Name.ToLower().Split('_').ElementAt(2));
string currentNo = ////value retreived from someMethod;
if (string.IsNullOrEmpty(currentNo))
{
if (groupedItems.Count() > 1)
{
foreach (var group in groupedItems)
{
foreach (var groupedItem in group)
{
ErrorFile(groupedItem);
}
}
}
else if (groupedItems.Count() == 1)
{
ProcessFile();
}
}
else
{
foreach (var group in groupedItems.Where(x => x.Key != currentNo))
{
foreach (var groupedItem in group)
{
ErrorFile(groupedItem);
}
}
}
- 存在嵌套 foreach 循环的重复代码。我正在寻找优化的可能性
- 如何处理 Split 和 ElementAt(2) return 错误。即使无法按 _.
拆分,我仍然需要调用 ErrorFile() 方法
如果没有更多上下文,很难理解您的代码真正在做什么,但这应该是正确的:
static void SomeMethod(IEnumerable<File> inputFiles)
{
var groupedItems = inputFiles.GroupBy
(f => splitAndFindElement(f.Name, '_', 2, string.Empty));
string currentNo = //whatever;
if (string.IsNullOrEmpty(currentNo))
{
if (groupedItems.Count() > 1)
{
foreach (var item in groupedItems.SelectMany(g => g))
{
ErrorFile(item);
}
}
else if (groupedItems.Count() == 1)
{
ProcessFile();
}
}
else
{
foreach (var item in groupedItems.Where(g => g.Key != currentNo).SelectMany(g => g))
{
ErrorFile(item);
}
}
}
辅助方法:
static string splitAndFindElement(string input, char splitter, int index, string resultOnFail)
{
var succesful = false;
string[] words = null;
if (input != null)
{
words = input.Split(splitter);
succesful = words.Length > index;
}
return succesful ? words[index] : resultOnFail;
}
这里的诀窍是如果文件不能被拆分,则使用关键字 ""
对文件进行分组。这将确保它们将使用 ErrorFile
进行处理,因为存在多个分组或因为键不等于 currentNo
。我在这里假设 Name
不能以 "_"
.
结尾
此外,SelectMany
用于扁平化可枚举的可枚举并避免嵌套循环。
我们可以优化如下重复循环,处理错误使用try catch
var groupedItems;
try
{
groupedItems= inputFiles.GroupBy(q => q.Name.ToLower().Split('_').ElementAt(2));
string currentNo = ////value retreived from someMethod;
if (string.IsNullOrEmpty(currentNo) && groupedItems.Count() == 1)
{
ProcessFile();
}
else
{
foreach (var group in groupedItems.Where(x => string.IsNullOrEmpty(currentNo) || x.Key != currentNo))
{
foreach (var groupedItem in group)
{
ErrorFile(groupedItem);
}
}
}
}
catch
{
ErrorFile(groupedItem);
}
我的以下代码有几个问题。
var groupedItems = inputFiles.GroupBy(q => q.Name.ToLower().Split('_').ElementAt(2));
string currentNo = ////value retreived from someMethod;
if (string.IsNullOrEmpty(currentNo))
{
if (groupedItems.Count() > 1)
{
foreach (var group in groupedItems)
{
foreach (var groupedItem in group)
{
ErrorFile(groupedItem);
}
}
}
else if (groupedItems.Count() == 1)
{
ProcessFile();
}
}
else
{
foreach (var group in groupedItems.Where(x => x.Key != currentNo))
{
foreach (var groupedItem in group)
{
ErrorFile(groupedItem);
}
}
}
- 存在嵌套 foreach 循环的重复代码。我正在寻找优化的可能性
- 如何处理 Split 和 ElementAt(2) return 错误。即使无法按 _. 拆分,我仍然需要调用 ErrorFile() 方法
如果没有更多上下文,很难理解您的代码真正在做什么,但这应该是正确的:
static void SomeMethod(IEnumerable<File> inputFiles)
{
var groupedItems = inputFiles.GroupBy
(f => splitAndFindElement(f.Name, '_', 2, string.Empty));
string currentNo = //whatever;
if (string.IsNullOrEmpty(currentNo))
{
if (groupedItems.Count() > 1)
{
foreach (var item in groupedItems.SelectMany(g => g))
{
ErrorFile(item);
}
}
else if (groupedItems.Count() == 1)
{
ProcessFile();
}
}
else
{
foreach (var item in groupedItems.Where(g => g.Key != currentNo).SelectMany(g => g))
{
ErrorFile(item);
}
}
}
辅助方法:
static string splitAndFindElement(string input, char splitter, int index, string resultOnFail)
{
var succesful = false;
string[] words = null;
if (input != null)
{
words = input.Split(splitter);
succesful = words.Length > index;
}
return succesful ? words[index] : resultOnFail;
}
这里的诀窍是如果文件不能被拆分,则使用关键字 ""
对文件进行分组。这将确保它们将使用 ErrorFile
进行处理,因为存在多个分组或因为键不等于 currentNo
。我在这里假设 Name
不能以 "_"
.
此外,SelectMany
用于扁平化可枚举的可枚举并避免嵌套循环。
我们可以优化如下重复循环,处理错误使用try catch
var groupedItems;
try
{
groupedItems= inputFiles.GroupBy(q => q.Name.ToLower().Split('_').ElementAt(2));
string currentNo = ////value retreived from someMethod;
if (string.IsNullOrEmpty(currentNo) && groupedItems.Count() == 1)
{
ProcessFile();
}
else
{
foreach (var group in groupedItems.Where(x => string.IsNullOrEmpty(currentNo) || x.Key != currentNo))
{
foreach (var groupedItem in group)
{
ErrorFile(groupedItem);
}
}
}
}
catch
{
ErrorFile(groupedItem);
}