C#使用LINQ Query将记录与进程数组的结果进行比较

时间:2015-05-18 04:50:43

标签: c# linq dataset

我编写了以下代码来比较一列的DataSet记录(即)记录。我正在遵循例外:

  

ex:“索引超出了数组的范围。”

  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;
       }
  }

7 个答案:

答案 0 :(得分:2)

虽然您在ds.Tables[0].Rows.Count上进行了迭代,但您使用ItemArray的计数器并非按预期使用Rows

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

我建议你检查你的逻辑

答案 1 :(得分:1)

您需要查看代码。 你在表的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;

答案 2 :(得分:1)

简单Linq查询,使DataRowCollection可枚举,应用select获取具有进程名称的给定列的列表并与原始进程名称进行比较:

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

答案 3 :(得分:1)

您的代码似乎有些问题。首先,正如其他人所说,您正在使用带有绑定k的索引k < ds.Tables[0].Rows.Count,但您正在使用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;
        }
    }
}

答案 4 :(得分:0)

使用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;

答案 5 :(得分:0)

您需要从当前正在迭代循环的当前行中选择数据。此外,您可能希望从特定列获取数据,因此您需要指定列名称,如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;

答案 6 :(得分:0)

尝试

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