其他分享
首页 > 其他分享> > 根据比较将元素添加到列表中时使用的最佳数据结构是什么

根据比较将元素添加到列表中时使用的最佳数据结构是什么

作者:互联网

  List<string> allApps = new List<string>();
        roster = MURLEngine.GetUserFriendDetails(token, userId);
        var usersfriends = from elements in roster.RosterEntries
                           where elements[0] == 'm' && elements[1] >= '0' && elements[1] <= '9'
                           select elements;
        foreach (string userid in usersfriends)
        {
            roster = MURLEngine.GetUserFriendDetails(token, userid);
            var usersapps = from elements in roster.RosterEntries
                            where elements[0] != 'm'
                            select elements;
            allApps.AddRange(usersapps);

            allApps = allApps.Distinct().ToList();
        }



        int countapps = 0;
        List<string> Appname = new List<string>();
        countapps = appList.Count();

        for (int y = 0; y < countapps; y++)
        {
            foreach (string li in allApps)  // 
            {
                bool istrueapp = appList.ElementAt(y).AppName.Equals(li);
                if (istrueapp == true)
                {
                    Appname.Add(appList.ElementAt(y).AppName);
                }
            }
        }

在上面的代码中,我首先获取字符串列表,即usersfriends,然后基于这些id,我获取用户的应用程序列表,然后将所有用户的所有应用程序添加到另一个列表,即allApps,因此整个过程很慢使用“列表”执行此操作大约需要20秒钟.尝试使用HashSet和SortedSet,但是它甚至更慢.

我的问题是在这种情况下我应该使用哪种数据结构?

真的会对我有帮助

解决方法:

关于LINQ,我最喜欢的事情是它可以让您描述您想做什么,而不是使您编写一堆使目标模糊的循环.这是代码的重构版本,我认为这很清楚,并且在我的测试平台上运行速度更快(0.5s对〜15s).

// create a hashset for fast confirmation of app names
var realAppNames = new HashSet<string>(appList.Select(a => a.AppName));

var roster = MURLEngine.GetUserFriendDetails(token, userId);

// get the ids of all friends
var friendIds = roster.RosterEntries
                      .Where (e => e[0] == 'm' && e[1] >= '0' && e[1] <= '9');

var apps = 
    friendIds 
    // get the rosters for all friends
    .SelectMany (friendId => MURLEngine.GetUserFriendDetails(token, friendId)).RosterEntries)
    // include the original user's roster so we get their apps too
    .Concat(roster.RosterEntries) 
    // filter down to apps only
    .Where (name => name[0] != 'm' && realAppNames.Contains(name)) 
    // remove duplicates
    .Distinct()
    // we're done!
    .ToList();

标签:list,data-structures,hashset,sortedset,c
来源: https://codeday.me/bug/20191030/1967671.html