这程序在我这儿一切都运行得好好地,但是一换到DOUG那儿就有问题.迟迟解决不了.原来的程序没写LOG,现在加上去了一看才知道,原来是GB的时间格式和我这儿不一样,原来用的DATETIME.PARSE在他那儿就过不去了.
改成用ParseExact加上格式限制就好了,代码如下:
- DateTime.ParseExact("12/30/1899","M/d/yyyy",null);
程序里有好几处类似的地方,要注意全部改到.
另外增加了LOG类,用来输出日志消息.
从LDAP读取记录,把edmworkstation和displayname这2项内容取出,放在一个dictionary中以备用.edmworkstation是用户的登记计算机名,可能含有多条记录.如果读取失败,则在dictionary中放一个"NotValid=yes"项目.
- private void GetLDAPInfo()
- {
- try
- {
- DirectoryEntry entry = new DirectoryEntry("LDAP://ldap.xxx.com/o=xxx,c=an");
- entry.AuthenticationType = AuthenticationTypes.SecureSocketsLayer;
- DirectorySearcher searcher = new DirectorySearcher(entry);
- searcher.Filter = "(alias=" + getLoginName() + ')';
- SearchResult result = searcher.FindOne();
- if (result == null)
- {
- LDAPInfo.Add("NotValid", "yes");
- errnum = -40;
- return;
- }
- string path = result.Path;
- path = path.Substring(path.LastIndexOf("/") + 1);
- ResultPropertyCollection p = result.Properties;
- string v = "";
- if (p.Contains("edmworkstation"))
- {
- foreach (var a in p["edmworkstation"])
- {
- v += a.ToString().Substring(0, a.ToString().IndexOf('/')) + ";";
- }
- LDAPInfo.Add("pcnames", v);
- }
- else
- {
- LDAPInfo.Add("NotValid", "yes");
- }
- if (p.Contains("displayName"))
- {
- v = "";
- foreach (var a in p["displayName"])
- {
- v += a.ToString();
- }
- LDAPInfo.Add("displayname",v);
- }
- }
- catch
- {
- LDAPInfo.Add("NotValid", "yes");
- errnum = -40;
- return;
- }
- }
有一个字符串,保存着一系列的机器名,要比较某个机器名是不是在这个字符串中, 此字符串以";"分隔,但是分号前后有可能会有空格. 先用SPLIT函数分割字符串,再用Array.IndexOf进行查找比较.
- string source = "a; ab; abc ; bc ;b";
- string unit = "bc";
- string[] sarray = source.ToLower().Split(new char[] {';',' '}, StringSplitOptions.RemoveEmptyEntries);
- return (Array.IndexOf<string>(sarray, unit.ToLower()) >= 0);
Generic是Framework 2.0的新元素,中文名字称之为“泛型” (我总是记不住这个名字 = =+)特征是一个带有尖括号的类,比如List<T>
在C#中,泛型用得最广泛的地方,就是集合(Collection)中。实际上,泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题(如果对装箱和拆箱概念不明,请百度搜索)。由于泛型的使用,使得集合内所有元素都属于同一类,这就把类型不同的隐患消灭在编译阶段——如果类型不对,则编译错误。
这里只讨论自定义泛型类。基本自定义如下:
- public class MyGeneric <T>
- {
- private T member;
- public void Method (T obj)
- {
- }
- }
这里,定义了一个泛型类,其中的T作为一个类,可以在定义的类中使用。当然,要定义多个泛型类,也没有问题。
- public class MyGeneric <TKey, TValue>
- {
- private TKey key;
- private TValue value;
- public void Method (TKey k, TValue v)
- {
- }
- }
泛型的初始化:泛型是需要进行初始化的。使用T doc = default(T)以后,系统会自动为泛型进行初始化。
限制:如果我们知道,这个将要传入的范性类T,必定具有某些的属性,那么我们就可以在MyGeneric<T>中使用T的这些属性。这一点,是通过interface来实现的。
- // 先定义一个interface
- public interface IDocument
- {
- string Title ...{get;}
- string Content ...{get;}
- }
- // 让范型类T实现这个interface
- public class MyGeneric <T>
- where T : IDocument
- {
- public void Method(T v)
- {
- Console.WriteLine(v.Title);
- }
- }
- // 传入的类也必须实现interface
- public class Document : IDocument
- {
- ......
- }
- // 使用这个泛型
- MyGeneric<Document> doc = new MyGeneric<Document>();
泛型方法:我们同样可以定义泛型的方法
- void Swap<T> (ref T x, ref T y)
- {
- T temp = x;
- x = y;
- y = temp;
- }
泛型代理(Generic Delegate):既然能够定义泛型方法,自然也可以定义泛型代理
- public delegate void delegateSample <T> (ref T x, ref T y)
- private void Swap (ref T x, ref T y)
- {
- T temp = x;
- x = y;
- y = temp;
- }
- // 调用
- public void Run()
- {
- int i,j;
- i = 3;
- j = 5;
- delegateSample<int> sample = new delegateSample<int> (Swap);
- sample(i, j);
- }
设置可空值类型:一般来说,值类型的变量是非空的。但是,Nullable<T>可以解决这个问题。
- Nullable<int> x; // 这样就设置了一个可空的整数变量x
- x = 4;
- x += 3;
- if (x.HasValue) // 使用HasValue属性来检查x是否为空
- {Console.WriteLine ("x="+x.ToString());
- }
- x = null; // 可设空值
使用ArraySegment<T>来获得数组的一部分。如果要使用一个数组的部分元素,直接使用ArraySegment来圈定不失为一个不错的办法。
- int[] arr = ...{1, 2, 3, 4, 5, 6, 7, 8, 9};
- // 第一个参数是传递数组,第二个参数是起始段在数组内的偏移,第三个参数是要取连续多少个数
- ArraySegment<int> segment = new ArraySegment<int>(arr, 2, 3); // (array, offset, count)
- for (int i = segment.Offset; i<= segment.Offset + segment.Count; i++)
- {
- Console.WriteLine(segment.Array[i]); // 使用Array属性来访问传递的数组
- }
在例子中,通过将Offset属性和Count属性设置为不同的值,可以达到访问不同段的目的。
(转自: http://blog.csdn.net/ezhuyin/archive/2007/10/05/1812312.aspx)





