如何使用LINQ进行过滤?

时间:2014-03-04 21:09:20

标签: c# linq

我在编写LINQ时遇到了麻烦,因为我是新手:

如何编写LINQ查询以在dataItem2中显示Process Date?当我在查询中添加select {}时,我收到一条错误消息,表明未使用IEnumerable。

这是具有虚拟数据的数据结构:

List<DataItem> allData = new List<DataItem>();
var dataItem2 = new DataItem();
dataItem2.AddHeader("Process Date", "10/30/2014");
dataItem2.AddHeader("ABC Rank", "None"); 
dataItem2.AddDataRow(new[] { "a2aaa0", "2x0", "c2ccc0" });
dataItem2.AddDataRow(new[] { "a2aaa1", "b2bbb1", "c2ccc1" });  
allData.Add(dataItem2);

这是DataItem类:

 class DataItem
{
    private readonly Dictionary<string, string> _headers = new Dictionary<string, string>();
    private readonly List<string[]> _rows = new List<string[]>();

    public IEnumerable<string> Headers
    {
        get { return _headers.Keys; }
    }

    public void AddHeader(string key, string value)
    {
        _headers.Add(key, value);
    }

    public string GetHeader(string key)
    {
        return _headers[key];
    }

    public string[] GetDataRow(int rowNumber)
    {
        return _rows[rowNumber];
    }

    public void AddDataRow(string[] row)
    {
        _rows.Add(row);
    }

    public int RowCount
    {
        get { return _rows.Count; }
    }

    public void Print()
    {
        Console.WriteLine("New item:");
        foreach (var header in Headers)
        {
            Console.WriteLine("{0}: {1}", header, GetHeader(header));
        }
        for (int i = 0; i < RowCount; i++)
        {
            var row = GetDataRow(i);
            for (int j = 0; j < row.Length; j++)
            {
                Console.WriteLine("Cell ({0}, {1}): {2}", i, j, row[j]);
            }
        }
    }

违规代码:

var typedQry = from b in allData.AsEnumerable() 
               select new DataItem { b.GetHeader("Status") }; 
Console.WriteLine(typedQry.ToList());

2 个答案:

答案 0 :(得分:0)

processDate显示dataItem2不需要LINQ ...只是用户标准点表示法。如果这不能回答您的问题,请发布相关代码。

正确的方法:

dataItem2.ProcessDate

另一方面,如果你有一个DataItem对象的集合,如下所示:

List<DataItem> items = PopulateMyItems();

然后你可以这样过滤:

items.Where(t=>t.ProcessDate > TwoWeeksAgo);

其中TwoWeeksAgo将是两周前的DateTime。

答案 1 :(得分:0)

试试这个:

var typedQry = from b in allData.AsEnumerable() 
               select new { Status = b.GetHeader("Status") }; 

var typedQry = from b in allData.AsEnumerable() 
               where b.GetHeader("Status") != null
               select b;

取决于你想做什么。