如何进行顺序排序?

时间:2015-11-26 19:44:29

标签: c#

我已经调查了this Q / A,虽然它在某种程度上工作但不如预期的那样。我希望它顺序发生。怎么做?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以使用Enumerable.Zip将代理和帐户组合在一起(在重复代理列表以匹配或超过帐户数量之后)。然后GroupBy代理。

var repeatCount = lstAccounts.Count / lstAgents.Count + 1;
var agents = Enumerable.Repeat(lstAgents, repeatCount).SelectMany(x => x);

// agents =      { "Agent1", "Agent2", "Agent3", "Agent1", "Agent2", "Agent3" }
// lstAccounts = { "1001"  , "1002"  , "1003"  , "1004"  , "1005" }

var result = agents
    .Zip(lstAccounts, (agent, account) => new { Agent = agent, Account = account })
    .GroupBy(x => x.Agent)
    .Select(g => new { Agent = g.Key, Accounts = g.Select(x => x.Account).ToList() })
    .ToList();

它可能不是最快的方式,但它简短易读。

修改

实现相同结果的另一种方式(可能更好)是首先使用index % lstAgents.Count将每个帐户映射到代理商的索引。

var result = lstAccounts
    .Select((acc, index) => new { AgentIndex = index % lstAgents.Count, Account = acc })
    .GroupBy(x => x.AgentIndex)
    .Select(g => new { Agent = lstAgents[g.Key], Accounts = g.Select(x => x.Account).ToList() })
    .ToList();

该算法与提议的by varocarbas非常相似,但以功能性(非命令性)方式表达。

答案 1 :(得分:1)

我认为传统循环是这里最好的方法:易于构建,清晰且可扩展性/可修改性友好。例如:

Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();

int i = -1;
while (i < lstAccounts.Count - 1)
{   
    for (int i2 = 0; i2 < lstAgents.Count; i2++)
    {
        i = i + 1;
        string curAccount = lstAccounts[i];
        string curAgent = lstAgents[i2];

        if (!results.ContainsKey(curAgent)) results.Add(curAgent, new List<string>());
        results[curAgent].Add(curAccount);

        if (i >= lstAccounts.Count - 1) break;
    }
}

另外,请注意这种方法非常快。作为参考:大约快4-5倍(使用提供的输入之一进行简单测试后的结果和Stopwatch)比Jakub在他的回答中提出的替代方案快。

答案 2 :(得分:1)

您可以使用linq扩展来尝试此方法。拆分扩展方法会将帐户列表拆分为&#34; n&#34;部件(代理程序的数量),以便您可以将每个部件分配给代理程序。

 class Program
 {
    static void Main(string[] args)
    {
        List<string> lstAgents = new List<string>() { "Agent1", "Agent2","Agent3" };
        List<string> lstAccounts = new List<string>() { "1001", "1002" ,"1003", "1004", "1005" };

        var op = lstAccounts.Split(lstAgents.Count);

        int i = 0;

        foreach (var accounts in op)
        {
            //Get agent
            Console.WriteLine("Account(s) for Agent: ", lstAgents[i]);

            foreach (var acc in accounts)
            {
                Console.WriteLine(acc);
            }
            Console.WriteLine(Environment.NewLine);
            i++;
        }

        Console.ReadKey();
    }


 }

  static class LinqExtensions
  {
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
    {
        int i = 0;
        var splits = from item in list
                     group item by i++ % parts into part
                     select part.AsEnumerable();
        return splits;
    }
}