none
請問datatable contains RRS feed

  • 問題

  •  老師前輩好

    我在一datatable的某個欄位想要找有某關鍵字的,請問這樣寫對嗎?

    以及我將query放至dr["欄位"] 會顯示system.data.datarow ...

    請問該如何解決?

    var query = dt.AsEnumerable()
                    .Where(r => r.Field<string>("list").IndexOf("cat",StringComparison.OrdinalIgnoreCase)>=0).ToString();

    我暫且先用 if (dt.Rows[i]["list"].ToString().IndexOf("cat", StringComparison.OrdinalIgnoreCase) >= 0) 解決

    但還是想學習用linq 方法處理,謝謝!

    2020年2月19日 上午 09:18

解答

  • 這樣的需求建議用SQL敘述直接做好再抛給應用程式簡單明瞭, 經濟又實惠, 請參考:

    SQL Query to concatenate column values from multiple rows in Oracle

    • 已標示為解答 effor 2020年2月24日 上午 09:14
    2020年2月21日 上午 11:24
  • 另外一種寫法是這樣 (好像比較簡單)

               var target = new string[] { "PowerPoint", "Word" };
    
                var result = dt.AsEnumerable().Select
                 (x =>
                   new { Index = x.Field<int>("Index"), Result =string.Join(",", x.Field<string>("list").Split(',').Intersect (target))}).Where(z => !string.IsNullOrEmpty(z.Result)).ToList();
    
                dataGridView1.DataSource = result;



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    • 已編輯 Bill ChungMVP 2020年2月21日 下午 03:59
    • 已標示為解答 effor 2020年2月24日 上午 09:14
    2020年2月21日 下午 03:50

所有回覆

  • 您可以這樣試看看(查詢CompanyName欄位內容包含Bon的記錄):

    String CompanyName = "Bon";         
    bool contains = dt.AsEnumerable().Any(row => row.Field<String>("CompanyName").Contains(CompanyName));
    

    2020年2月19日 上午 10:44
  • 謝謝tihs老師

    是可以的

    可能我弄錯了,即然回傳true表示內容有包含特定字串的記錄

    那時我一直執意要把查詢的結果放至var query,但query 又是system.data.datarow  ?

    既然已回傳true那表示就是有包含,故我要的查詢結果就是有包含特定字串

    好像就是這樣而已,不知上述是否正確? 謝謝

    2020年2月21日 上午 01:58
  • 你想做的是這個效果嗎 ?

      private void button1_Click(object sender, EventArgs e)
      {
          var dt = new DataTable();
          dt.Columns.Add(new DataColumn("index", typeof(int)));
          dt.Columns.Add(new DataColumn("list", typeof(string)));
    
          for (int i = 0; i < 10; i++)
          {
              var row = dt.NewRow();
              row[0] = i;
              if (i == 3 || i == 5 )
              {
                  row[1] = "cat";
              }
              else
              {
                  row[1] = "dog";
              }
              dt.Rows.Add(row);
          }
    
          var result = dt.AsEnumerable().Where((r) => r.Field<string>("list").Contains ("cat")).Select((y) => new { index = y.Field<int>("index"), list = y.Field<string>("list") }).ToList();
    
          dataGridView1.DataSource = result;
    
      }
    


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年2月21日 上午 05:20
  • 如果您是要取得欄位內容包含指定內容的所有記錄, 可以這樣做:

    DataRow[] RowArray = ds.Tables[0].AsEnumerable().Where(row => row.Field<String>("CompanyName").Contains(CompanyName)).ToArray();
    

    2020年2月21日 上午 06:09
  • 謝謝二位老師的回覆

    我想要做的效果如下圖

    每位使用者安裝了很多軟體,如果有符合指定的條件則顯示每筆的在第二欄

    目前只會如下寫法,一直在學linq怎實現 ?謝謝

    if (dt.Rows[i]["list"].ToString().IndexOf("office", StringComparison.OrdinalIgnoreCase) >= 0)
    {
          str += "Office,";
    }

    ..................................

      dr["illegal"] = str;
      dtSoftware.Rows.Add(dr);

     GridView1.DataSource = dtSoftware;


    2020年2月21日 上午 08:59
  • 這樣的需求建議用SQL敘述直接做好再抛給應用程式簡單明瞭, 經濟又實惠, 請參考:

    SQL Query to concatenate column values from multiple rows in Oracle

    • 已標示為解答 effor 2020年2月24日 上午 09:14
    2020年2月21日 上午 11:24
  •  private void button1_Click(object sender, EventArgs e)
            {        
                // 作假資料
                List<string> list = new List<string>
                {
                    "Word,Excel,PowerPoint",
                    "Visio,Excel,PowerPoint",
                    "Excel,PowerPoint",
                    "PowerPoint",
                    "Excel",
                    "Visio,Word,Excel,PowerPoint",
                    "Visio,Access,Excel,PowerPoint",
                    "Access,Word,PowerPoint",
                    "PowerPoint,Word",
                    "Excel,Word"
                };
    
                var dt = new DataTable();
                dt.Columns.Add(new DataColumn("index", typeof(int)));
                dt.Columns.Add(new DataColumn("list", typeof(string)));
                for (int i = 0; i < 10; i++)
                {
                    var row = dt.NewRow();
                    row[0] = i;
                    row[1] = list[i];
                  
                    dt.Rows.Add(row);
                }
    
    
    
                // 假設要找 PowerPoint 和 Word
    
                var result = dt.AsEnumerable().Select
                    (x =>
                      new { Index = x.Field<int>("Index"), Result = x.Field<string>("list").Split(',').Where(y => y.Equals("powerpoint", StringComparison.InvariantCultureIgnoreCase) || y.Equals("word", StringComparison.InvariantCultureIgnoreCase)).Aggregate(string.Empty, (a, b) => a += b + ",") }
                    ).Where( z => !string.IsNullOrEmpty (z.Result) ).ToList();
    
               
                dataGridView1.DataSource = result;
    
            }
    還是這是你想要的結果 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2020年2月21日 下午 02:12
  • 另外一種寫法是這樣 (好像比較簡單)

               var target = new string[] { "PowerPoint", "Word" };
    
                var result = dt.AsEnumerable().Select
                 (x =>
                   new { Index = x.Field<int>("Index"), Result =string.Join(",", x.Field<string>("list").Split(',').Intersect (target))}).Where(z => !string.IsNullOrEmpty(z.Result)).ToList();
    
                dataGridView1.DataSource = result;



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    • 已編輯 Bill ChungMVP 2020年2月21日 下午 03:59
    • 已標示為解答 effor 2020年2月24日 上午 09:14
    2020年2月21日 下午 03:50
  • 如果你有興趣把 linq 學好,忠成老師的課程不可錯過

    https://skilltree.my/events/2020/3/…/head-first-linq-batch-3

    https://skilltree.my/events/2020/4/11/practical-linq-batch-3


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年2月21日 下午 03:54
  • 謝謝二位老師的回覆指導

    遇到問題就可以多了解多學~謝謝

    2020年2月24日 上午 09:16