C# 代码优化分组



我对下面的代码有几个问题。

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) 返回错误时,我该如何处理。即使我无法按_拆分,我仍然需要调用错误文件()方法。

如果没有更多的上下文,很难理解你的代码到底在做什么,但这应该是正确的:

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);
}

相关内容

  • 没有找到相关文章

最新更新