首页 新闻 会员 周边

紧急求助c#面试题

0
悬赏园豆:40 [已解决问题] 解决于 2015-05-18 10:41

要求实现一个string template engine.

publicstring Apply(string template, object dataSource) {

        }

根据输入的template和dataSource得到输出值

 

eg:

Template DataSource Output
Hello [Name] { Name = "John"   }  Hello John
Hello [Contact.FirstName]
    [
Contact.LastName]

         Contact = new {
           
 FirstName =   "John",
            
LastName = "Smith"
         }
    }
Hello John Smith
[With   Contact]
            Hello [
FirstName] [LastName]
                [With
Organisation]
                     You are from [
Name] in [City]
                [/With]
    [/With]
{
         Contact = new {
           
 FirstName =   "John",
            
LastName = "Smith"
            
Organisation = new {
               
Name   = "Acme Ltd"
              
 City =   "Auckland"
                 }
         }
    }
Hello John Smith
    You are from Acme Ltd in Auckland

 

请教有会的大侠吗  万分感谢

新西兰程序员的主页 新西兰程序员 | 初学一级 | 园豆:3
提问于:2015-05-05 14:10
< >
分享
最佳答案
0
   public static string Apply(string template, object dataSource)
            {
                  template = Regex.Replace(template, @"(?<=\[With\s+(\w+)\].*?)\[With\s+(\w+)\]", "[With $1.$2]");
                  template = Regex.Replace(template, @"(?<=\[With\s+((\w+\.)*\w+)\].*?)\[(\w+)\]", "[$1.$3]");
                  template = Regex.Replace(template, @"\[With\s+((\w+\.)*\w+)\]|\[/With\]", "");
                  var matchs = Regex.Matches(template, @"\[(\w+\.)*\w+\]");

                  JavaScriptSerializer serializer = new JavaScriptSerializer();
                  dynamic data = serializer.Deserialize(serializer.Serialize(dataSource), typeof(object));
                  foreach (Match m in matchs)
                  {
                        var keys=m.Value.Substring(1,m.Value.Length-2).Split('.');
                        dynamic myvalue = data[keys[0]];
                        for (int i = 1; i < keys.Length; i++)
                        {
                              myvalue = myvalue[keys[i]];
                        }
                        template = template.Replace(m.Value, myvalue.ToString());
                  }
                  return template;
            }
收获园豆:20
Yu | 专家六级 |园豆:12980 | 2015-05-06 09:34

这个面试题,不单是这三种结构,这个Apply方法要使用任何类型的数据源和任何类型的结构。而且是要在这一个方法中实现。

 

有方法吗

新西兰程序员 | 园豆:3 (初学一级) | 2015-05-07 05:19

@新西兰程序员: 只要template 结构不变就行了,datasource已经是 object 类型了

Yu | 园豆:12980 (专家六级) | 2015-05-07 08:32

@新西兰程序员: 模板都有一定规则的,要通用任何结构,这么万能还真没有

Yu | 园豆:12980 (专家六级) | 2015-05-07 08:47
其他回答(2)
0

这个面试题不是面试初级程序员的吧,你面错职位了。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-05-05 14:26
1

中午一觉睡醒就看到这个面试题, 虽然我不是什么大侠, 但是考虑到楼主在面试比较着急,我就憋着尿,给出我的code思路, 希望能帮到楼主, 如果面试完了有时间的话, 希望楼主能采纳!

 1 public string Apply(string template, object dataSource)
 2         {
 3             string output = string.Empty;
 4             var dataSourceAllFields = dataSource.GetType().GetProperties();
 5             foreach (var sourceField in dataSourceAllFields)
 6             {
 7                 template = template.Replace(string.Format("[{0}]", sourceField.Name), sourceField.Attributes.ToString());
 8             }
 9 
10             output = template;
11             return output;
12         }
收获园豆:20
请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-05 14:32

无法解决第三个用例。。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-05-05 14:48

@幻天芒: 这只是个思路, 第三个示例里面意思是说可能有很多类的嵌套, 这个需要用递归了。 刚睡醒,就没写那么深了。

支持(0) 反对(0) 请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-05 15:05

@请叫我头头哥: 嗯,模板替换的思路还是不错的。。我想了想使用codeDom,还是比较复杂。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-05-05 15:06

@幻天芒: 

With 这个结构就得硬来了...

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2015-05-05 16:21

@爱编程的大叔: 如果是js,还比较容易实现一点。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-05-05 20:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册