2013年8月17日 星期六

在社群網路中找Fiona是否是Adm的朋友的朋友的~~的朋友

// 字典
function Dict(elements) {
    // 允許選擇性的初始對映表
    this.elements = elements || {};
}
Dict.prototype.has = function (key) {
    // 只有自有特性 (own property)
    return {}.hasOwnProperty.call(this.elements, key);
};
Dict.prototype.get = function (key) {
    // 只有自有特性
    return this.has(key) ? this.elements[key] : undefined;
};
Dict.prototype.set = function (key, val) {
    return this.elements[key] = val;
};
Dict.prototype.remove = function (key) {
    delete this.elements[key];
};
// 任意挑選集合元素
Dict.prototype.pick = function () {
    for (var key in this.elements) { // 這裡的elementsMember實體
        if (this.has(key)) {
            return key;
        }
    }
    throw new Error("空的字典");
};
// 為了避免字典被汙染, 所以建立一個工作集, 把字典放在這個類別中, 用來追蹤目前集合中的元素項目
function WorkSet() {
    this.entries = new Dict();
    this.count = 0;
}
WorkSet.prototype.isEmpty = function () {
    return this.count === 0;
};
WorkSet.prototype.add = function (key, val) {
    if (this.entries.has(key)) {
        return;
    }
    this.entries.set(key, val);
    this.count++;
};
WorkSet.prototype.get = function (key) {
    return this.entries.get(key);
};
WorkSet.prototype.remove = function (key) {
    if (!this.entries.has(key)) {
        return;
    }
    this.entries.remove(key);
    this.count--;
};
WorkSet.prototype.pick = function () {
    return this.entries.pick();
};
// 社交網路成員
function Member(name) {
    this.name = name;
    this.friends = [];
}
// 關聯朋友 方法1:用一個while迴圈來實作, 每次從集合中挑選出一個任意的元素, 並從work-set中移除
Member.prototype.inNetworkSet = function (other) {
    var visited = {};
    var workset = new WorkSet();
    workset.add(this.name, this); // 呼叫者的名子當 key, 用來先查找該呼叫者的朋友
    while (!workset.isEmpty()) {
        var name = workset.pick(); // 取出 key
        var member = workset.get(name);
        workset.remove(name);
        if (name in visited) { // 不要重新訪問成員
            continue;
        }
        visited[name] = member;
        if (member === other) { // 找到成員
            return true;
        }
        member.friends.forEach(function (friend) {
            workset.add(friend.name, friend);
        });
    }
    return false;
};
// 關聯朋友 方法2:將工作項目存到陣列中而非一個集合(set), 以完全相同的順序來巡訪社交網路路線
Member.prototype.inNetworkList = function (other) {
    var visited = {};
    var worklist = [this];
    while (worklist.length > 0) {
        var member = worklist.pop();
        if (member.name in visited) {// 不要重新訪問成員
            continue;
        }
        visited[member.name] = member;
        if (member === other) {
            return true;
        }
        member.friends.forEach(function (friend) {
            worklist.push(friend); // 加入工作清單
        });
    }
    return false;
};
var a = new Member("Adm"),
    b = new Member("Bob"),
    c = new Member("Chris"),
    d = new Member("David"),
    e = new Member("Eason"),
    f = new Member("Fiona");
a.friends.push(b);
b.friends.push(c);
c.friends.push(e);
d.friends.push(b);
e.friends.push(d, f); // a f 關聯

console.log(a.inNetworkList(f));

建立公司,雇用員工:從子類別的建構式呼叫超類別的建構式 (借用建構式)

// 公司
function Company(name, address) {
    this.name = name;
    this.address = address;
    this.stafts = [];
}
// 雇用
Company.prototype.hire = function (staft) {
    this.stafts.push(staft);
};
// 開除
Company.prototype.fire = function (staft) {
    var i = this.stafts.indexOf(staft);
    if (i >= 0) {
        this.stafts.splice(i, 1);
    }
};
// 員工
function Staff(company, name) {
    this.company = company; // 每個員工都會儲存對其公司的參考
    this.name = name;
    company.hire(this); // 把自己加到公司的雇用表(staft hire)

}
// 離職
Staff.prototype.quit = function () {
    this.company.fire(this);
};
// 經理 (將特定類型的員工實作為 Staff 的子類別)
function Manager(company, name) {
    // 為了確保 Manager 實體會正確地被初始化為 Staff, 這個建構式必須明確地呼叫 Staft 建構式
    // 把新產生的物件bind Staff 的接收者
    // 呼叫 Staff 建構首先能先確保 Staff 所建立的所有實體特性都會被加入到新物件中
    Staff.call(this, company, name);
    // 接著 Manager 就能定義他自己的實體特性, 例如 title
    this.title = "Manager";
}
// 為了使 Manager 成為 Staff 的子類別, 他的原形(prototype)必須繼承自 Staff.prototype
Manager.prototype = Object.create(Staff.prototype);
// 一旦建立了 Manager 的原形物件, 就可以為他加上所有實體都會共用的特性
Manager.prototype.duty = "lead stafts";
// 建立公司
var hc = new Company("TheHappyCompany", "taiwan");
// 新增員工
var ian = new Manager(hc, "Ian"); // Manager {company: Company, name: "Ian", title: "Manager", duty: "lead stafts", quit: function} 
var jay = new Staff(hc, "Jay"); // Staff {company: Company, name: "Jay", quit: function}
var ben = new Staff(hc, "Ben");
hc.fire(jay); // 將指定員工開除

2013年8月8日 星期四

使用反射,取得要篩選排序的欄位或指定欄位的數值

#1 C#裡面,依照條件選擇要撈取或排序的欄位

public ActionResult Links(string idstring sort)
{
    var _db = new HappyMovieEntities();
     // 資料表的欄位
    string colIsName;
    string colOnName;
    SortBy sortBy = (SortBy)Enum.Parse(typeof(SortBy), sort); // 字串轉成Enum
    switch (sortBy)
    {
        case SortBy.Viewd:
            colIsName = "IsViewed";
            colOnName = "ViewedOn";
            break;
        case SortBy.Like:
            colIsName = "IsLiked";
            colOnName = "LikedOn";
            break;
        default:
            goto case SortBy.Viewd;
    }
    System.Reflection.PropertyInfo propIs = typeof(UserLinkVideo).GetProperty(colIsName);
    System.Reflection.PropertyInfo propOn = typeof(UserLinkVideo).GetProperty(colOnName);
    ViewBag.DateOnCol = colOnName// 給在View要反射欄位時使用,如果需要的話
    // 撈取 + 排序
    var links = _db.UserLinkVideo.Where(x => x.VideoId == id && ((bool)propIs.GetValue(xnull))).OrderByDescending(x => propOn.GetValue(xnull));
    return View(links);
}

#2 View裡面,依照條件取得巢狀迴圈的值

@{
    // 要使用的欄位,這裡的【ModelTypeName】為傳入該View的Model型別名稱
    System.Reflection.PropertyInfo prop = typeof(HappyMovie.Model.UserLinkVideo).GetProperty(ViewBag.DateOnCol);
    string displayText}
@foreach (var item in Model)
{
    displayText = item.GetType().GetProperty(prop.Name).GetValue(itemnull).ToString();
}