2017-05-16 2 views
1

Ceci est ma première question, s'il vous plaît ignorer mes erreurs. Je cours un projet C# qui passe les conditions du flux Twitter, 5 attributs dans une chaîne nommée "urlAll". Je vais diviser les propriétés avec * # 06 # que j'ai déclaré avant qui est donné ci-dessous. J'ai créé un autre projet avec application de formulaire Windows en utilisant LinqToTwitter et il retourne une liste. Tout ce dont j'ai besoin est de retourner la liste comme une table ado.net que j'ai écrite auparavant. Voici mon code de flux Twitter.Windows formulaire liste d'application à ADO.NET datable

//initializing a list of current news feeds 
    private List<Status> currentTweets; 

    //parent class of the form application 
    //interface 
    public TwitterFeed() 
    { 
     //initializing the components 
     InitializeComponent(); 
     //call the function that will display current 200 feeds from twitter 
     GetMostRecent200HomeTimeLine(); 
     //clearing the textbox in which the feeds will be displayed 
     lstTweetList.Items.Clear(); 

     //displaying the feed in text box right 
     currentTweets.ForEach(tweet => lstTweetList.Items.Add(tweet.User.Name + ":" + tweet.Text)); 
     //display follow list in text box left 
     //GetSideBarList(GetFollowers()).ForEach(name => lstFollowNames.Items.Add(name)); 

    } 


    //method that gets current 200 feeds form twitter of the user 
    private void GetMostRecent200HomeTimeLine() 
    { 
     var twitterContext = new TwitterContext(authorizer); 
     var tweets = from tweet in twitterContext.Status 
        where tweet.Type == StatusType.Home && 
        tweet.Count == 200 
        select tweet; 
     currentTweets = tweets.ToList(); 
    } 

quel serait le moyen de les intégrer?

+0

parce que je dois passer C# DataTable à un C++ DataTable, alors je vais les insérer dans la base de données. –

+0

Comment les deux extraits de code que vous avez partagés sont liés les uns aux autres? À quoi ressemble la classe 'Status'? Où est votre méthode qui renvoie DataTable dans le deuxième extrait de code? –

+0

c'est apparenté. Parce que je veux utiliser le 2ème code dans le premier code. mais le 2ème code a une classe et une interface donc je ne peux pas utiliser une classe dans une autre classe. Mon but est d'utiliser la bibliothèque LinqToTwitter (une API Twitter). Le statut est une classe par défaut/intégrée dans LinqToTwitter. J'ai été en mesure de recueillir des flux en direct à partir de Twitter en utilisant Windows formulaire de demande qui renvoient une liste et affichée à travers la liste. maintenant je veux implémenter le code sur un projet de bibliothèque de classe C# qui retournera un DataTable au lieu d'une liste. –

Répondre

0

Cela devrait fonctionner si votre liste n'a pas d'autre collection:

public static DataTable ToDataTable<T>(this IList<T> list) 
     { 
     DataTable table = null; 
     if (list != null && list.Count > 0) 
     { 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); 

      List<PropertyDescriptor[]> propList = new List<PropertyDescriptor[]>(); 

      table = new DataTable(); 
      foreach (PropertyDescriptor item in properties) 
      { 
       if (IsArrayOrCollection(item.PropertyType)) 
       { 
        continue; 
       } 
       AddColumnsForProperties(typeof(T).Namespace, null, table, (new[] { item }).ToList(), ref propList); 
      } 

      object[] values = new object[propList.Count]; 

      foreach (T item in list) 
      { 
       for (int i = 0; i < values.Length; i++) 
        values[i] = GetValueFromProps(propList[i], item) ?? DBNull.Value; 

       table.Rows.Add(values); 
      } 
     } 
     return table; 
     } 

    private static object GetValueFromProps(PropertyDescriptor[] descriptors, object item) 
    { 
    var result = item; 
    foreach (var descriptor in descriptors) 
    { 
     if (result != null) 
     { 
      result = descriptor.GetValue(result); 
     } 
    } 
    return result; 
    } 


    private static void AddColumnsForProperties(string myNamespace, string parentName, DataTable dt, List<PropertyDescriptor> p, ref List<PropertyDescriptor[]> properties) 
    { 
    var pLast = p.Last(); 

    if (pLast.PropertyType.Namespace != null && pLast.PropertyType.Namespace.StartsWith(myNamespace)) 
    { 
     var allProperties = pLast.GetChildProperties(); 
     if (allProperties.Count > 0) 
     { 
      foreach (PropertyDescriptor item in allProperties) 
      { 
       var newP = p.ToList(); 
       newP.Add(item); 

       string childParentName = !String.IsNullOrEmpty(parentName) 
       ? String.Format("{0}.{1}.{2}", parentName, pLast.Name, item.Name) 
       : String.Format("{0}.{1}", pLast.Name, item.Name); 
       if (item.PropertyType.Namespace != null && item.PropertyType.Namespace.ToLower().StartsWith(myNamespace)) 
       { 
       AddColumnsForProperties(myNamespace, childParentName, dt, newP, ref properties); 
       } 
       else if (!dt.Columns.Contains(childParentName)) 
       { 
       dt.Columns.Add(childParentName, Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType); 
       properties.Add(newP.ToArray()); 
       } 
      } 
     } 
     else if (!dt.Columns.Contains(pLast.Name)) 
     { 
      dt.Columns.Add(pLast.Name, Nullable.GetUnderlyingType(pLast.PropertyType) ?? pLast.PropertyType); 
      properties.Add(p.ToArray()); 
     } 
    } 
    else if (!dt.Columns.Contains(pLast.Name)) 
    { 
     dt.Columns.Add(pLast.Name, Nullable.GetUnderlyingType(pLast.PropertyType) ?? pLast.PropertyType); 
     properties.Add(p.ToArray()); 
    } 
    } 
+0

Merci. Je vais tester cela. Je vous ferai savoir. –