使用Linq

时间:2015-05-05 10:40:01

标签: c# json linq

平台:C# IDE:Visual Studio 2010

我是Linq的新手并尝试使用它来过滤Json对象。有什么建议? 这是代码:

string jsonGetData = objstats.getData_Emp(lblEmp.Text,lblYear.Text);
//JavaScriptSerializer strJsonSer = new JavaScriptSerializer();

var lstEmpAnalysis = JsonConvert.DeserializeObject<empAnalysis>(jsonGetData);

现在,从上面的lstEmpAnalysis中,我需要在类empAnalysis的第一个表上过滤数据,其中一个索引包含国家/地区,并且仅显示过滤器中使用的那些国家/地区数据,如下所示:

public class empAnalysis
{
    public List<List<object>> Table { get; set; }
    public List<List<double>> Table1 { get; set; }
    public List<List<object>> Table2 { get; set; }
}

那么,有什么建议吗?

输入就是这样:

Table 
[0][0] : Abc
[0][1] : India
[0][2] : Engineer
[1][0] : Xyz
[1][1] : UK
[1][2] : Support Engineer

我想要过滤的只是包含英国的数据。

1 个答案:

答案 0 :(得分:1)

如果你总是知道你的表的第二个参数是国家,你可以这样做:

var items= from item in empAnalysis.Table where item[1]=="UK" select item; 

虽然我总是喜欢在这里使用强类型对象,正如我在评论中提到的那样: 例如:

public class Employee{
       public string Name{get;set;}
       public string Country{get;set;}
       public string JobTitle{get;set;}
}

public class empAnalysis
{
    public List<Employee> Table { get; set; }
    public List<List<double>> Table1 { get; set; }
    public List<List<object>> Table2 { get; set; }
}

然后我们可以写:

var items= from employee in empAnalysis.Table where employee.Country=="UK" select item;
为了清楚起见,我们也可以这样做:

var people=from item in empAnalysis.Table select new {
    Title=item[0],
    Country=item[1],
    JobTitle=item[2],
};

var peopleFromUK=from person in people where person.Country=="UK";

虽然您应该被告知您正在获取具有Title,Country和JobTitle属性的匿名类型对象的列表。

<强>更新

这是我使用NUnit编写的测试,然后传递。

[TestFixture]
public class LinqToObjectTests
{
    [Test]
    public void ThereShouldBeOnlyOneListForUK()
    {
        var list = new List<List<object>>
        {
            new List<object>(), 
            new List<object>()
        };

        list[0].Add("Name");
        list[0].Add("UK");
        list[0].Add("Title");


        list[1].Add("Name");
        list[1].Add("NOT UK");
        list[1].Add("Title");
        var query = from item in list where item[1] == "UK" select item;
        Assert.AreEqual(1, query.Count());
    }
}