【问题标题】:Accessing the properties of an IEnumerable访问 IEnumerable 的属性
【发布时间】:2017-08-26 02:25:07
【问题描述】:

我正在使用 TweetInvi 来获取一堆与指定主题标签匹配的推文。我用以下方法做到这一点:

var matchingTweets = Search.SearchTweets(hashtag);

这会返回一个 IEnumerable(名为 ITweet,接口为 Tweet),但是我无法创建 TweetsList<>,因为 Tweet 是静态类型。

我创建了一个objects 的列表,使用的是:

List<object> matches = matchingTweets.Cast<object>().ToList();

但是,虽然matchingTweets IEnumerable 的每个成员都有许多属性,但我无法使用以下方法访问它们:

long tweetID = matches[i].<property>;

使用matches[i].ToString() 返回推文内容,那么如何有效地将matchingTweets 中的结果转换为列表,然后访问这些列表成员的属性?我最好避免使用dynamic

【问题讨论】:

  • 你需要访问什么属性?
  • IEnumerable 中的任何类型都不能是静态的,这是不可能的。

标签: c# twitter ienumerable tweetinvi


【解决方案1】:

您无法访问这些属性是有道理的。您将其转换为object,因此您只能访问objects 属性和方法(就像您所说的可能已被覆盖)。

像这样访问它应该没问题:

List<ITweet> tweets = matchingTweets.Take(5).ToList(); 

你可以做的就是将它投射到你的一个新对象上:

var tweets = matchingTweets.Select(item => new {
                                       property1 = item.property1,
                                       property2 = item.property2
                                   })
                           .Take(5).ToList();

然后您将能够访问您需要的内容。现在,如果您需要在该函数范围之外共享这些数据,请创建一个 DTO 对象并对其进行初始化,而不是使用匿名类型。

根据项目的规模和工作量,通常在与这样的外部服务交互时创建一层 DTO 对象是一个好习惯。然后,如果他们的模型发生更改,您可以仅将更改包含在 DTO 中。


如果你想要的只是前 5 个的 id,那么:

var ids = matchingTweets.Take(5).Select(item => item.id).ToList();

【讨论】:

  • @Wolfish - 如果您想提取前 5 个结果,请检查更新
  • 请注意 - 您的答案也有效,但@macccettura 在 TweetInvi 的上下文中提供了一个答案,这在此处更相关,因此选择他的答案作为“选择”答案。
【解决方案2】:

在上面的示例中,您试图从推文中获取 ID。 ITweet 实现了 ITweetIdentifier,其中包含 Id 属性。您可以通过以下方式访问它:

var matchingTweets = Search.SearchTweets(hashtag);

//Grab the first 5 tweets from the results.
var firstFiveTweets = matchingTweets.Take(5).ToList();

//if you only want the ids and not the entire object
var firstFiveTweetIds = matchingTweets.Take(5).Select(t => t.Id).ToList();

//Iterate through and do stuff
foreach (var tweet in matchingTweets)
{
    //These are just examples of the properties accessible to you...
    if(tweet.Favorited)
    {
        var text = tweet.FullText;
    }     
    if(tweet.RetweetCount > 100)
    {
        //TODO: Handle popular tweets...
    }   
}

//Get item at specific index
matchingTweets.ElementAt(index);

我不知道你想对所有信息做什么,但由于SearchTweets 返回一个ITweets 的IEnumerable,你可以访问ITweet 定义的任何内容。

我强烈建议您查看他们的wiki。它组织得很好,并为您提供了一些基本任务的清晰示例。

【讨论】:

  • 我可以访问matchingTweets中的特定推文吗?
  • 如果您知道它的 ID 或其他一些信息,您可以使用 LINQ。我用如何通过 id 抓取推文更新了我的答案。
  • 就是这样 - 我知道任何推文的 ID,但我想提取结果中前五个的 ID
  • 更新为获取搜索返回的前 5 个
  • matchingTweets.ElementAt(index)
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2021-05-16
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
相关资源
最近更新 更多