如何进行顺序排序

本文关键字:排序 顺序 何进行 | 更新日期: 2023-09-27 18:24:51

我已经研究过这个问答,尽管它在一定程度上起到了作用,但并没有达到预期。我希望它按顺序发生。如何做到这一点?

提前谢谢。

如何进行顺序排序

您可以使用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();

该算法与varocarbas提出的算法非常相似,但以函数(而非命令)的方式表示。

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

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;
    }
}

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

您可以使用linq扩展来尝试这种方法。拆分扩展方法将帐户列表拆分为"n"个部分(代理数量),以便您可以将每个部分分配给代理。

 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;
    }
}