代码之家  ›  专栏  ›  技术社区  ›  ila

LINQ提取对象

  •  0
  • ila  · 技术社区  · 14 年前

    我有一个JSON“多级”响应,需要对其进行反序列化,从反序列化的类结构中,我需要提取某个类的所有对象。

    在我使用的代码下面,最后我发现我的结果是空的,不是填充的。

    // given these two classes:
    [DataContract]
    public class ThingsList
    {
        [DataMember(Name = "status")]
        public string Status { get; set; }
        [DataMember(Name = "since")]
        public double Since { get; set; }
        [DataMember(Name = "list")]
        public Dictionary<string, ThingsListItem> Items { get; set; }
        public DateTime SinceDate { get { return UnixTime.ToDateTime(Since); } }
    }
    [DataContract]
    public class ThingsListItem
    {
        [DataMember(Name = "url")]
        public string Url { get; set; }
        [DataMember(Name = "title")]
        public string Title { get; set; }
    }    
    
    // I can deserialize my json to this structure with:
    ThingsList results = JsonConvert.DeserializeObject<ThingsList>(e.Result);
    
    // now I need to "extract" only the ThingsListItem objects, and I'm trying this:
    var theList = from item in results.Items.OfType<ThingsListItem>()
            select new 
                        {
                            Title = item.Title,
                            Url = item.Url
                        };
    // but "theList" is not populated.
    

    这里的要点是(我相信): -我尝试使用results.items.oftype(),以便只提取thingsListItem对象,“upper”类中的对象在 公共字典项get;set; 行。

    有什么想法吗?如果不清楚…

    谢谢 安德莉亚

    1 回复  |  直到 14 年前
        1
  •  2
  •   Ahmad Mageed    14 年前

    编辑: 为了清楚起见,更新了我的回复。

    因为您的字典值属于类型 ThingsListItem 您可以使用字典的 Values 财产。不需要使用 OfType 检查它们的类型并提取它们。简单使用:

    var items = results.Items.Values;
    

    这个 价值观 属性将返回 ICollection<ThingsListItem> . 然后可以使用foreach迭代结果。不必使用LINQ。


    价值观 上面描述的属性应该足够了,我将指出一些与您最初的LINQ查询尝试有关的问题。

    1) 下面的查询可能是您所追求的。同样,字典是 价值观 属性是访问项的键(不打算使用双关语):

    var theList = from item in results.Items.Values
                  select new
                  {
                      Title = item.Title,
                      Url = item.Url
                  };
    

    2) 你为什么用 new ?那将返回一个 IEnumerable 匿名类型。您已经定义了一个类,那么为什么要投影到一个新的匿名类型中呢?你应该保留基础 弦论 通过直接选择项目以获取 IEnumerable<ThingsListItem> :

    var theList = from item in results.Items.Values
                  select item;
    foreach (var item in theList)
    {
        Console.WriteLine("Title: {0}, Url: {1}", item.Title, item.Url);
    }
    

    您通常会投影到一个新的匿名类型中,以定义一个具有您感兴趣的数据属性的类型。通常,您会在查询后立即使用它们,而到现有类中的选择可以立即使用,也可以传递给其他期望该类型的方法。

    希望这为您解决了一些问题,并且您对使用LINQ以及何时使用 新的 关键字。重申一下,就你的目的而言 价值观 属性应该足够。使用LINQ选择项目是多余的,当有其他立即的方法这样做。