编程学习杂烩

1. 面向过程编程方法 ~ 面向对象编程方法 ~ 函数式编程

软件设计思想:函数--对象--组件-服务
[1]. 面向过程编程:编程范式,结构化开发方法,面向功能的程序设计、面向数据流的处理方式,按功能分析系统需求,自顶向下、逐步求精、模块化,结构化分析、结构化设计、结构化编程,最小的程序单元是函数,一切以函数为中心、函数最大;
[2]. 面向对象编程:编程范式,Object-Oreinted Programming,基于代码重用的需要,最小的程序单元是类,类定义=成员变量(状态数据)+方法(行为),一切以对象为中心、对象最大,面向对象分析、面向对象设计、结构化面向对象编程,高内聚、低耦合,封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism),消息是对象之间相互通信的机制、继承是类之间共享属性和操作的机制;
[3]. 基于组件开发:Component-Based Development,软件工程实践,组件是对功能的抽象,设计时通常要求组件之间高内聚松耦合。关注系统层次、子系统边界和子系统间通讯的的设计,处于代码层面。  
[4]. 面向服务架构:SOA, Service-Oriented Architecture,基于组件的模型,粒度最大,模块化系统结构一组可互操作的服务的原则或方法论,是创建面向服务应用程序的最佳实践,通常在考虑系统架构时才会触及SOA。作为一种进行系统开发的新的体系架构,具体应用程序的功能由松耦合并且具有统一接口定义方式的组件(也就是Service)通过服务之间定义良好的接口和契约组合构建。SOA主要用于分布式系统的构建,设计者只需要通过集成各种服务即可完成系统的构建。
[5]. 函数式编程:下一个主流编程范式(programming paradigm),"结构化编程"的一种,函数是"第一等公民"(first class functions),函数相对独立、没有"副作用",模块化、自由度高、易于理解,易于部署"并发编程"(concurrency)。函数式编程 - sqh;  

2.  预处理

预处理指令 PreProcessor Directive 指示编译器如何处理源代码。

条件编译指令:#if, #else, #elif, #endif
诊断指令:#warning, #error
行号指令:#line
区域指令:#region, #endregion
#pragma warning disable/restore:关闭或重新开启警告信息 

3.  数组 Array - 链表 List 等集合类的输出方法总结

Java

arr = lst.Where(过滤条件).ToArray();
Array.ForEach(arr, val => Console.Write(val+" "));

lst = arr.Where(过滤条件).ToList();
lst.ForEach(val => Console.Write(val+" "));

Java

遍历 Collection 对象 Collection c = new 派生类();的方法:
  [1].System.out.println(c);
  [2].利用"foreach"循环:for(Object obj : c)
  [3].利用对象的实例方法 forEach():c.forEach(Lambda表达式) 或 c.forEach(System.out::println);
  [4].利用 Iterator 接口的 forEachRemaining() 方法:it.forEachRemaining(Lambda表达式);

4. 转义字符:\n 和 \r

  • \n 换行,\r 回车(把光标移动到该行的首位置)
  • 在 win 系统中操作文件时,换行需要 \r\n 同时用才会生效(Environment.NewLine)

5. 关于字典集新增键值对

(1)Dictionary        
var dic = new Dictionary<string, Object>();

// 若_key不存在,则新增键值对<_key, _value>
// 若_key存在,则System.ArgumentException: Dictionary<TKey,TValue> 中已存在具有相同键的元素
dic.Add(_key, _value);
// 若_key不存在,则新增键值对<_key, _value>
// 若_key存在,则更新键_key对应的值为_value
dic[_key] = _value;

(2)ConcurrentDictionary
var dic = new ConcurrentDictionary<string, Object>();

// 键值对成功添加,返回值则为true,否则为false
// 即:若_key不存在,返回true;若_key存在,返回false
dic.TryAdd(_key, _value);
// 功能同Dictionary
dic[_key] = _value; 

附带参考字典集索引功能的源定义

public class Dictionary/ConcurrentDictionary<TKey, TValue> : XXX
{
     // 摘要: 获取或设置与指定的键相关联的值
     // 参数key: 要获取或设置的值的键
     // 返回结果: 与指定的键相关联的值,如果找不到指定的键
     //   get操作会引发System.Collections.Generic.KeyNotFoundException
     //   set操作会创建一个具有指定键的新元素
     // 异常:
     //  System.ArgumentNullException: key为null
     //  System.Collections.Generic.KeyNotFoundException: 已检索该属性,并且集合中不存在key
     public TValue this[TKey key] { get; set; }
}

6. 关于Distinct去重

核心是提供通用比较类,实现 IEqualityComparer<T> 接口:

public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
    private Func<T, V> keySelector;

    public CommonEqualityComparer(Func<T, V> keySelector)
    {
        this.keySelector = keySelector;
    }

    public bool Equals(T x, T y)
    {
        return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
    }

    public int GetHashCode(T obj)
    {
        return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
    }
}

然后再应用扩展方法,新增Distinct方法(此处注意理解扩展方法的原理)

public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
    {
        return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
    }

然后可以优雅地使用:

list = list.Distinct(p => p.Name).ToList();

具体参见:奇思妙用:Distinct 扩展

 

 

 

posted @ 2016-08-07 16:03  万箭穿心,习惯就好。  阅读(266)  评论(0编辑  收藏  举报