我已经调查了this Q / A,虽然它在某种程度上工作但不如预期的那样。我希望它顺序发生。怎么做?
提前致谢。
答案 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;
}
}