簡體   English   中英

C#代碼優化組

[英]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)返回錯誤時,我該如何處理。 即使我無法通過_分割,我仍然需要調用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM