簡體   English   中英

C#使用LINQ Query將記錄與進程數組的結果進行比較

[英]C# Using LINQ Query compare the records with result of process array

我編寫了以下代碼來比較一列DataSet(即)記錄的記錄。 我得到以下例外:

例如:“索引超出了數組的范圍。”

  public void GetRunningTask()
  {
      // Process[] lstprocess = Process.GetProcesses();
      conn=new SqlConnection("Data Source=.; Initial Catalog='TTES'; Integrated Security=SSPI;");
      da=new SqlDataAdapter("Select AppName from LRNSetting", conn);
      ds=new DataSet();
      da.Fill(ds,"LRNSetting");

      // Process[] lstprocess = Process.GetProcesses();
      for (int k = 0; k < ds.Tables[0].Rows.Count; k++)
      {
        Process[] lstprocess = Process.GetProcesses();
        // DataRow dr=ds.Tables[0].Rows.Cast<DataRow>().Single(row=>row["AppName"])

        var pro = from p in lstprocess
                 //where p.ProcessName.Contains("LRCDual")
                 //where p.ProcessName.Contains(ds.Tables[0].Rows[k].ItemArray)  //added temporary
                 where (p.ProcessName.Contains(ds.Tables[0].Rows[0].ItemArray[k].ToString()))
                 select p;
       }
  }

雖然您在ds.Tables[0].Rows.Count上進行了迭代,但是您正在使用ItemArray的計數器而不是按預期方式使用Rows

ds.Tables[0].Rows[0].ItemArray[k].ToString()

我建議你檢查一下你的邏輯

您需要檢查您的代碼。 你在表的Rows Count上進行了迭代,但是你正在使用ItemArray的計數器而不是像預期的那樣使用Rows

var pro = from p in lstprocess
             //where p.ProcessName.Contains("LRCDual")
             //where p.ProcessName.Contains(ds.Tables[0].Rows[k].ItemArray)  //added temporary
             where (p.ProcessName.Contains(ds.Tables[0].Rows[0].ItemArray[k].ToString()))
             select p; 

這段代碼用

var pro = from p in lstprocess
             //where p.ProcessName.Contains("LRCDual")
             //where p.ProcessName.Contains(ds.Tables[0].Rows[k].ItemArray)  //added temporary
             where (p.ProcessName.Contains(ds.Tables[0].Rows[k].ItemArray['CollumnName'].ToString()))
             select p;

簡單的Linq查詢,使DataRowCollection可枚舉,應用select以獲取具有進程名稱的給定列的列表並與原始進程名稱進行比較:

lstprocess.Where(p=>ds.Tables[0].Rows.AsEnumerable.Select(row=>row["ColumnName"].ToString()).Contains(p.ProcessName))

您的代碼似乎有些問題。 首先,正如其他人所說的那樣,你正在使用帶有綁定k < ds.Tables[0].Rows.Count索引k ,但你正在使用它來對抗ds.Tables[0].Rows[0].ItemArray[k] 他們是兩個不同的東西。

最好不要使用這樣的索引。 您正在使用LINQ作為部分代碼,但您可以將其用於其余部分。

此外,您似乎不想丟棄任何一次性物品。 您必須確保丟棄所有一次性用品。

所以,試試這個:

using (var conn = new SqlConnection("Data Source=.; Initial Catalog='TTES'; Integrated Security=SSPI;"))
{
    using (var da = new SqlDataAdapter("Select AppName from LRNSetting", conn))
    {
        using (var ds = new DataSet())
        {
            da.Fill(ds,"LRNSetting");

            var appNames =
                ds
                    .Tables[0]
                    .Rows
                    .Cast<DataRow>()
                    .Select(x => x[0].ToString())
                    .ToArray();

            var pro =
                from p in Process.GetProcesses()
                where appNames.Any(x => p.ProcessName.Contains(x))
                select p;
        }
    }
}

使用ItemArray[k]意味着您假設您有k列但是如您的代碼所示,您有k行。

所以這一定是你要找的東西:

//Getting all table cells for every column and row as string
var tableValues = ds.Tables[0].AsEnumerable()
                              .SelectMany(i => i.ItemArray.Select(j => j.ToString()))
                              .ToList();

Process[] lstprocess = Process.GetProcesses();

var pro = from p in lstprocess
          where tableValues.Any(i => p.ProcessName.Contains(i))
          select p;

您需要從當前正在迭代循環的當前行中選擇數據。 此外,您可能希望從特定列獲取數據,因此您需要指定列名,如ds.Tables[0].Rows[k]["columnName"].ToString()) 將“columnName”替換為實際列名。

var pro = from p in lstprocess
          //where p.ProcessName.Contains("LRCDual")
          //where p.ProcessName.Contains(ds.Tables[0].Rows[k].ItemArray)  //added temporary
          where (p.ProcessName.Contains(ds.Tables[0].Rows[k]["columnName"].ToString()))
          select p;

嘗試

var pro = from p in lstprocess
          where (p.ProcessName.Contains(ds.Tables[0].Rows[k][0].ToString()))
          select p;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM