技术开发 频道

封装 if/else、swith/case及while

       不过专门为string写个扩展,这个问题可以化解,如下: 

public static string If(this string s, Predicate<string> predicate, Func<string, string> func)
        {
            
return predicate(s) ? func(s) : s;
        }

  看来扩展方法也是有优先级的:对同一个类进行多次扩展,扩展方法相名,参数也等效(数量、顺序相同),非泛版扩展要比泛型版扩展优先级高。

  下面再来看一段swith代码,很啰嗦的!这里是为了引出扩展硬写出来的:

public static void Test4()
        {
            
string englishName = "apple";
            
string chineseName = string.Empty;
            
switch (englishName)
            {
                
case "apple":
                    chineseName
= "苹果";
                    
return;
                
case "orange":
                    chineseName
= "桔子";
                    
return;
                
case "banana":
                    chineseName
= "香蕉";
                    
return;
                
case "pear":
                    chineseName
= "";
                    
break;
                
default:
                    chineseName
= "未知";
                    
break;
            }
            Console.WriteLine(chineseName);
        }

  我们把这种方式用扩展方法来完成:

public static  TOutput Switch<TOutput, TInput>(this TInput input, IEnumerable<TInput> inputSource, IEnumerable<TOutput> outputSource, TOutput defaultOutput)
        {
            IEnumerator
<TInput> inputIterator = inputSource.GetEnumerator();
            IEnumerator
<TOutput> outputIterator = outputSource.GetEnumerator();

            TOutput result
= defaultOutput;
            
while (inputIterator.MoveNext())
            {
                
if (outputIterator.MoveNext())
                {
                    
if (input.Equals(inputIterator.Current))
                    {
                        result
= outputIterator.Current;
                        
break;
                    }
                }
                
else break;
            }
            
return result;
        }
0
相关文章