试题一:写程序完成在Dictionary<K,V>中寻找特定的V的K试题二:写程序删除List<int> 中所有大于10的整数试题三:写程序,用反射深度复制只有公用成员变量(public field)的类(其中类成员仍旧是只有公用成员变量的类)例如public class ABC { public int ID; public string Name; public ABC Child; }试题四:设计一个以Dictionary为基础的类缓存,其中保存的类来自于一个慢速设备。同时阐述一下如何在多线程环境下避免死锁,如何减少从慢速设备获取类的次数。试题五:对于如下Sample.aspx
<html><body>
<form id="form1" runat="server">
<asp:Button runat="server" onclick="Button_Click" Text="Test" />
</form>
</body></html>按执行顺序排列以下方法并说明其主要用途
Page_Load Button_Click Render CreateChildControls Init试题六:假定用户只知道基本的javascript, html, xml,向其解释AJAX的运行原理试题七:用DOS命令删除一个目录下所有不是.cs结尾的文件(可能用到的DOS命令有FOR, IF, FINDSTR, DEL, DIR)
<html><body>
<form id="form1" runat="server">
<asp:Button runat="server" onclick="Button_Click" Text="Test" />
</form>
</body></html>按执行顺序排列以下方法并说明其主要用途
Page_Load Button_Click Render CreateChildControls Init试题六:假定用户只知道基本的javascript, html, xml,向其解释AJAX的运行原理试题七:用DOS命令删除一个目录下所有不是.cs结尾的文件(可能用到的DOS命令有FOR, IF, FINDSTR, DEL, DIR)
{
if(tmpKVP.Value==...)
{...}
}
2,foreach(int i in intList)
{
if(i>10)
...
}
foreach只能用来查询,不能用来删除
试题四:设计一个以Dictionary为基础的类缓存,其中保存的类来自于一个慢速设备。同时阐述一下如何在多线程环境下避免死锁,如何减少从慢速设备获取类的次数。
这个等高人来解决竟然还有dos题。
第三不会,又反射又深度复制,代码记忆力没那么高至少当时绝对写不出代码
第六估计我也说不清楚,那个几个类名忘记了,直接用AJAX控件的人就想我一样。
最后一个绝对不会,我直接就回答,GOOGLE下。。试题四,思路大概是这样的,多线程去缓存中操作数据,不直接和慢速设备打交道;然后一个线程只负责将缓存中的数据,定时或者按照外部指令,和慢速设备进行交互,当这个线程和慢速设备交互的时候,应该lock住那些跨线程的资源,有用到这些资源的线程等待交互的完成后再继续
int index
)
删除用这个函数
关于如何减少从慢速设备获取类的次数。感觉看以参照.net垃圾回收器的工作过程,将访问频繁的缓存排前,丢弃访问不频繁的
难道for就可以用来删除了?
删除的时候最好从后向前删
Init CreateChildControls Page_Load Button_Click Render 至于用途,打开百度,输入“asp.net生命周期” ,第一篇文章,就是微软msdn上的
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "str1");
dict.Add(2, "str2");
dict.Add(3, "str3");
Dictionary<int, string> d = dict.Select(s => s)
.Where(s => s.Key == 1).ToDictionary(p => p.Key,p=>p.Value);
foreach (KeyValuePair<int, string> key in d)
{ Console.Write(key.Key);
} static List<int> GetByLambda(List<int> lst)
{
return lst
.Select(i => i)
.Where(i => i > 10)
.OrderBy(i => i)
.ToList();
}
Load
以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
Init阶段
对当前Control进行准确初始化
对子Control进行初始化
Button_Click
用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件
Render
Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
如果创建自定义控件,通常要重写此方法以输出控件的标记。
CreateChildControls方法一般用于创建组合控件。在此方法中可以定义自己需要的控件,进行实例化和赋值等,并将其添加到当前Controls集合中
private FieldInfo[] GetObjectFields(Type o)
{
FieldInfo[] tmpFields=o.GeFields(BindingFlags.Public | BindingFlags.Instance);
List<FieldInfo> ret=new List<FieldInfo>();
tmpFields.ToList().ForEach(t=>
{
if(t.DeclaringType.IsClass&&t.DeclaringType!=typeof(string))
{
ret.AddRange(GetObjectFields(t.DeclaringType));
}
else
{
ret.Add(t);
}
});
return ret.ToArray();
}
List<int> lstInt = new List<int>();
for (int i = lstInt.Count - 1; i >= 0; i--)
{
if (lstInt[i] > 10)
{
lstInt.RemoveAt(i);
}
} Dictionary<K, V> dic = new Dictionary<K, V>();
List<K> lstK = new List<K>();
V v;
foreach (K k in dic.Keys )
{
if (dic[k] == v)
{
lstK.Add(k);//return k;
}
}
public int ID;
public string Name;
public ABC Child;
public ABC Clone()
{
ABC result = new ABC();
Type t = typeof(ABC);
System.Reflection.FieldInfo[] fields = t.GetFields();
if (fields != null && fields.Length > 0)
{
for (int i = 0; i < fields.Length; i++)
{
fields[i].SetValue(result, fields[i].GetValue (this));
}
}
return result;
}
} 测试代码 ABC abc1 = new ABC();
abc1.ID = 1;
ABC abc2 = abc1.Clone();
abc1.ID = 15; MessageBox.Show(abc2.ID.ToString());
1.for (int i = list.Count - 1; i >= 0; i--)
{
if (list[i] > 10)
{
list.RemoveAt(i);
}
}
2.list = list.Where(p => p <= 10).ToList<int>();
包括微软,都应该还在用DOS或类似的脚本工具进行日常的批处理。而且程序员自己写的很多小工具都是在文字模式下运行的,原因是文字模式速度快,信息量大,同时还方便和其他文字工具结合。
using System.Collections.Generic;
using System.Threading;namespace TestCache
{
public interface SlowDevice<K, V>
{
V Get(K key);
} public class ValueWrapper<V>
{
public V Value;
public object Lock;
} public class Cache<K, V>
{
private SlowDevice<K, V> _Device;
private Dictionary<K, ValueWrapper<V>> _Loaded; public V Get(K key)
{
ValueWrapper<V> vw;
object l = null; lock (_Loaded)
{
if (_Loaded.ContainsKey(key))
{
// 缓存里已经有内容
vw = _Loaded[key];
l = vw.Lock; if (l == null) // 而且没有锁
return vw.Value;
}
else
{
vw = new ValueWrapper<V>(); vw.Lock = new object();
Monitor.Enter(vw.Lock); _Loaded[key] = vw;
}
} if (l != null)
{
// 等待慢速设备读取完成
Monitor.Enter(l); // 释放其他线程
Monitor.Exit(l);
}
else
{
// 慢速设备读取
lock (_Device) // 假设设备不支持多线程
{
vw.Value = _Device.Get(key);
} lock (_Loaded) // 可以不加锁,代价是在特定条件下多执行一次等待
{
// 释放其他线程
Monitor.Exit(vw.Lock); // 改变状态
vw.Lock = null;
}
} return vw.Value;
}
}
}