如何进行顺序排序
本文关键字:排序 顺序 何进行 | 更新日期: 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;
}
}