-2

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

var matchingTweets = Search.SearchTweets(hashtag);

这将返回一个 IEnumerable (命名为ITweet的接口Tweet),但是我无法创建一个List<>of Tweets,因为Tweet它是一个静态类型。

相反,我objects使用以下方法制作了一个列表:

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

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

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

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

4

2 回答 2

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();
于 2017-03-31T18:09:30.613 回答
1

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

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返回一个 IEnumerable,ITweets您可以访问ITweet定义的任何内容。

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

于 2017-03-31T18:14:54.683 回答