Tag Archives: LINQ

Linq compare 2 lists – .Net Check if Items Not exist on current List – 如何在2個Lists 中找出和第二個List不相同的Item 項目

之前和大家介紹了怎樣可以找出在2個List of String上找出2個List 都有的 Item 出來

今天想和大家介紹怎樣從兩個Lists 中找出 第一個List上 在第二個List裡面沒有的 Item

我們可以使用 ListExcept 功能

			// Source List with String A,B,C,D,E
			List listA = new List();
            listA.Add("A");
            listA.Add("B");
            listA.Add("C");
            listA.Add("D");
            listA.Add("E");

			// List To Compare with String 1,A,4,E,5
            List listB = new List();
            listB.Add("1");
            listB.Add("A");
            listB.Add("4");
            listB.Add("E");
            listB.Add("5");

			// Retrieve the List of String which does not appear on the second List
            List matchList = listA.Except(listB).ToList().ForEach(Console.WriteLine);


Linq compare 2 lists - .Net Check if Items Not exist on current List - 如何在2個Lists 中找出和第二個List不相同的Item 項目
Happy Coding

LINQ try to get a list of int from string – 如何使用Linq在String上取出所有數字出來

今天要為同事解決一個 在ASP.Net MVC [.Net]將String 轉成List of Int的問題

情況是這樣的:
公司的一個ASP.Net MVC 的Project 上..客戶會在 WebGrid上的checkbox上選擇需要的東西..
我的同事便寫了一個隱藏的field 每當客戶選擇或取消選項時..
他用了Javascript 來把數據append 到隱藏的field上
他便用”|” 來把數據分隔
但是我們還是要做一些Validation
避免數據有問題時..會令到這個程式碼/程序出現問題
E.G.
1|ab|| | 3 |4|
有空格或有字母時..當把數據轉到List Of Int時便會出現錯誤了

由於他工作放大假中..
所以我便要去解決他沒有解決的問題了
就是用.net去把這一個 String轉成 List of Int..

開頭我都有一些不知如何是好..
因為可以用一個比較簡單的方法..
但是可能要寫多很多的程式碼
就是先建立一個StringArray..
之後用Int.TryParse來把 成功認到是Int的 數據加進另一個List of Int上..
感覺不太好..

做了一些research 之後終於找到解決方法了:
解決方法:

我們可以嘗試使用LINQ 的方法去解決這個問題

  // Input
  string tempInput = "1|ab|| | 3 |4|";

  // This value is used for int.TryParse reference
  int tempVal=0;
  List intList = (from i in tempInput.Split('|').ToList()
                                          where int.TryParse(i, out tempVal)
                                          select  int.Parse(i)).ToList();
  int noOfInt = intList.Count();
  // Output number of integer recognised 
  Console.WriteLine("No of Int: " + noOfInt.ToString());
  
  for(int i = 0; i< intList.Count(); i++){
  	// Output the recognised integer one by one
  	Console.WriteLine(intList[i].ToString());
  }
  

Use Linq to extract List of Integer from string

Happy Coding

Linq compare 2 lists – .Net Check if Items exist on Both Lists – .Net如何在2個Lists 中找出相同的Item 項目

今天需要寫一個功能去看看2個 List of String 上有那些String 是2個Lists內都有的

做了一會research後 終於找到解決方法了

我們可以使用 ListIntersect 功能

Linq - to get matched item from 2 lists of string

E.G.

            	// Source List with String A,B,C,D,E
            			List listA = new List();
            listA.Add("A");
            listA.Add("B");
            listA.Add("C");
            listA.Add("D");
            listA.Add("E");

            			// List To Compare with String 1,A,4,E,5
            List listB = new List();
            listB.Add("1");
            listB.Add("A");
            listB.Add("4");
            listB.Add("E");
            listB.Add("5");

          			// Retrieve the List of String which appear on both List
            List matchList = listA.Intersect(listB).ToList();

            for (int i = 0; i < matchList.Count; i++)
            {
               			// Output the list of matched string
                Console.WriteLine(matchList[i]);
            }

Happy Coding

.Net Get All files under the directory Improved version—使用.Net找出 資料夾/文件夾入所有檔案改進版

很久之前寫過一個網誌是介紹如何找出 資料夾/文件夾入所有檔案

VB.Net Get All files under the directory —使用VB.Net找出 資料夾/文件夾入所有檔案

之前是用一個叫Recursion 的方法來取得資料夾裡面的資料夾內的檔案…
最近另外一個Project上又要做一個差不多的功能
令使用者可以看到資料夾入有什麼檔案可以下載
回看返之前的Blog 這個功能應該不用寫到那麼複雜的
還有這個function的效能其實也不太好

所以便去做一下research看看有沒有更好的解決方法了

解決方法:
原來我做可以使用DirectoryInfo中的GetFiles 方法
我們還可以設定一些變數去選擇要找出資料夾入..那一類型的檔案等等

E.G.
使用DirectoryInfoGetFiles功能
DirectoryInfo dirInfo = new DirectoryInfo(“資料夾路徑”);
第一個變數是Filter File Extension “*.*” 是選擇所有檔案 而 “*.txt”則是只選擇 .txt
List FileInfoList = dirInfo.GetFiles(Extension Filter, SearchOption).ToList();
C#


// Initialise DirectoryInfo 設定將要找出檔案的資料夾
            DirectoryInfo dirInfo = new DirectoryInfo(txt_Folder.Text.Trim());

            // 使用DirectoryInfo 的GetFiles功能
            // 第一個變數是Filter File Extension "*.*" 是選擇所有檔案 而 "*.txt"則是只選擇 .txt
            // 第二個變數是SearchOption 有 AllDirectories 和 TopDirectoryOnly 2個選擇,
            // 我們想找出資料夾入所有的檔案..包括資料夾內的資料夾所以我們會用到AllDirectories
            List<FileInfo> fileInfoList = dirInfo.GetFiles("*.*", SearchOption.AllDirectories).ToList();

            // 如果你只需要檔案名稱的話可以使用Directory Instead of Directory List.. 他會
            // List<String> fileInfoList = Directory.GetFiles(txt_Folder.Text.Trim(), "*.*", SearchOption.AllDirectories).ToList();

            dgv_FileList.DataSource = fileInfoList;

Hope you find it useful

ASP.Net Web Application To ASP.Net MVC Notes II Drop Down List Sorting DropDownList- ASP.Net Web Application To ASP.Net MVC 新手筆記II Drop Down List 排序

在之前的 Post介紹了如何在ASP.Net MVC 上建立DropDownList

ASP.Net Web Application To ASP.Net MVC Notes Drop Down List- ASP.Net Web Application To ASP.Net MVC 新手筆記I Drop Down List

和在這個Post 上介紹了如何在 ASP.Net MVC 上如何實現SelectedIndexChanged 的效果
ASP.Net MVC DropDownList SelectedIndexChanged 一些ASP.Net MVC的很有用的Javascript I – 在ASP.Net MVC上的一個和ASP.Net DropDownList 的 SelectedIndexChanged 功能

現在發現有些美中不足的地方..
就是當我們有一對DropDownList
一個是用來給用戶以產品 ID 來選擇 的
另一個是用產品名稱給用戶選擇…
由於資料是在資料庫取出來的..
如果我們在資訊庫的排序 是以
產品編號 或產品名稱 來排序的… 另一面便有可能不會順序了
[因為資料輸入的次序可能不一樣.. 和 產品編號 / 編號 多數是用 Auto ID產生 的]
如果我們直接把資料databind 鎖定到DropDownList上… 當使用者選擇/使用DropDownList 便可能會感覺到怪怪的了.. 因為資料可能不是順序的
以Food ID來排序
ASP.Net MVC DropDownList Sorted By Food ID

可惜 Food Name 沒有被排序
ASP.Net MVC DropDownList Unsorted
解決方法:
1) 使用2個不同的Query 來取後資料… 一個以產品編號來排序 而別一個以產品名稱 來排序
[這個方法會佔了資料庫的資源..感覺不太好.. E.G. 當你有一個比較複雜的 Query是 便會感到他的問題]

2) 另一個方法是在取得到給果後 在List Of <Object> 上 或DataTable上進行排序
[感覺好一點]

以下是程式碼
ASP.Net 時代.. 我使用DataTable 是這樣解決的|
.aspx –這裡我們有一對DropDownList

&lt;h2&gt;
        Welcome to Share ChiWai ASP.NET!
    &lt;/h2&gt;
    Food: &lt;asp:DropDownList ID="ddl_Food" runat="server" /&gt;
    &lt;asp:DropDownList ID="ddl_Food_Name" runat="server" /&gt;

c#

//這個Sample 我們在Page_Load Event上 做DataBind
protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
//使用 ShareChiWai_Model上的 Get_FoodByCategoryID 來取出一些 食物名稱
                ShareChiWaiWebTutorial.Models.ShareChiWai_Model Share_Model = new ShareChiWaiWebTutorial.Models.ShareChiWai_Model();
//之後Assign 到DataTable上 以便可以Assign 到2個DropDownList 的DataSource上
                DataTable tbl_Food  = Share_Model.Get_FoodByCategoryID("00003");
//假設我們的Data已經以 Food_ID來排序
//所以我們可以直接把他Assign到 DropDownList的DataSource上
                ddl_Food.DataSource = tbl_Food;
                ddl_Food.DataTextField = "Food_ID";
                ddl_Food.DataValueField = "Food_ID";
                ddl_Food.DataBind();
//為了令到我們的DropDownList更可用. 我們需要幫Food_Name 這一個DropDownList 排序
//由於我們是使DataTable的關係..所以我們可以用 DataTable.DefaultView.Sort ="要排序的 Column 名稱"
//這便可以把這個DataTable排序了
                tbl_Food.DefaultView.Sort = "Food_Name";
//之後再幫DataTable Assign到另一個DropDownList上便完成了
                ddl_Food_Name.DataSource = tbl_Food;
                ddl_Food_Name.DataTextField = "Food_Name";
                ddl_Food_Name.DataValueField = "Food_ID";
                ddl_Food_Name.DataBind();

            }
        }

Asp.Net 結果
ASP.Net Drop Down List Sorted
ASP.Net MVC
.Controller
C#

//建立一個 ShareChiWai_Model  用來取資料用的
 private ShareChiWai_Model Share_Model;
        public  DropDownListSortingController()
        {
            Share_Model = new ShareChiWai_Model();
        }

        public ActionResult Index()
        {
//使用 ShareChiWai_Model上的 Get_FoodByCategoryID_List 來取出一些 食物名稱
            List Food_List = Share_Model.Get_FoodByCategoryID_List("00003");
//之後Pass到我們的View 上
            return View(Food_List);
        }

.cshtml

&lt;h2&gt;Drop Down List Sorting&lt;/h2&gt;
//定義了這一個頁用的Model 是 List Of Food 的類的
@model List&lt;ShareChiWaiWebTutorial.Models.Food&gt;
@{
//把 List Of Food DataBind 到 SelectList 上 for Food_ID 用的DropDownList
    var ddl_Food = new SelectList(Model, "Food_ID", "Food_ID");
//用Variable來 儲存 Food_ID 以方便 把SelectedValue Assign到下一個DropDownList上
//令到資料更Consistant
string SelectedFoodID= Model[0].Food_ID;
//之後我們會做差不多的動作 For Food Name 用的DropDownList
//為一分別是 我們要重新排列 這一個List..以Food Name來排序
//我們可以使用LINQ 的放法 去解決這個問題..
<span style="font-family: 'Courier 10 Pitch', Courier, monospace; font-size: x-small;"><span class="Apple-style-span" style="line-height: 19px;">// Model.OrderBy(f =&gt; f.要排序的屬性).ToList() </span></span>var ddl_FoodName = new SelectList(Model.OrderBy(f =&gt; f.Food_Name).ToList() , "Food_ID", "Food_Name", SelectedFoodID);
 }

&lt;h2&gt;Food Categories&lt;/h2&gt;
Food:
@Html.DropDownList("ddl_Food", ddl_Food)
@Html.DropDownList("ddl_FoodName", ddl_FoodName)

ASP.Net MVC DropDownList Sorted 成果

Hope you find it useful

.Net Sorting Multiple properties in List of Object – .Net 上List of Object 以多項屬性進行排序

最近有朋友問了一個很好的問題..
List Of Object 上 用多過一個的屬性來排序?

//建立一個ShareChiWai_Model - 用來取一些Sample的List Data
 ShareChiWai_Model Share_Model = new ShareChiWai_Model();
//這個例子我們使用Get_Food_List() 的資料..因為有很多屬性可以用來示範
            List<Food> FoodList = Share_Model.Get_Food_List();
//我們可以用FoodList.sort() 這個功能來做 Sorting 可惜只可以 以一個屬性來排序
            FoodList.Sort(delegate(Food f1, Food f2) { return f1.Price.CompareTo(f2.Price); });
//再次使用 的時候只會以 最後排序的屬性來排序
    FoodList.Sort(delegate(Food f1, Food f2) { return f1.Price.CompareTo(f2.Price); });
            dgv_Data.DataSource = FoodList;

Sort() cannot solve .Net Sorting Multiple properties in List of Object

我比較喜歡使用LINQ..感覺得方便..
LINQ 可以很方便地解決這個問題

解決方法:
我們可以使用List.OrderByThenBy 來解決這個問題
E.G.

//下面的例子我用了Order By Decending  Order因為這樣子會容易一點看到效果
FoodList = FoodList.OrderByDescending(f => f.Price).ThenBy(f => f.Food_Name).ToList();
//由於 OrderBy/OrderByDescending/ThenBy/ThenByDescending IOrderedEnumerable<TSource> 的關係..所以我們要用ToList()來把他轉回做 List

.Net Sorting Multiple properties in List of Object  work with LINQ
Hope you find it useful

ArrayList Distinct Item – 在ArrayList中除去重複的 Item

今日有個朋友問..
怎樣可以在一個ArrayList中 找出Distinct的 Item..
E.G.除去重複的 Item.

解決方法有多個..其中一個是寫一個For Loop..
當沒有重複時
把ArrayList入面的Object 寫進去..

另外一個方法是使用LINQ

由於這是ArrayList的關係..
所以不可以直接使用List<>中的 LINQ 功能

解決方法十分簡單..
只需要把這個ArrayList變成 List<>
之後再轉換成ArrayList便可
E.G.
C#

//建立一些Dummy Data
ArrayList ArrList=new ArrayList();
ArrList.Add("1");
ArrList.Add("2");
ArrList.Add("1");
ArrList.Add("1");
ArrList.Add("3");

//建立一個新的ArrayList來儲存Distinct了的ArrayList的結果
ArrayList newList = new ArrayList();
//把ArrayList轉成Array..
//之後使用Linq的方法Distinct這個Array..
//最後把Distinct了的Array轉成Array 再用Add Range這個功能.把所有Array加進新的ArrayList上
newList.AddRange(ArrList.ToArray().Distinct().ToArray());

//用以下的程式碼顯示結果
for (int i = 0; i < newList.Count; i++)
{
   MessageBox.Show(newList[i].ToString());
}

Hope you find it useful