1
A
回答
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
我认为传统循环是这里最好的方法:易于构建,清晰且非常可缩放/可修改友好。例如:
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
之后进行简单测试后的结果)。
1
你可以用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;
}
}
相关问题
- 1. 顺序进行排序组
- 2. 行进行排序的字母顺序
- 3. 对顺序ID进行重新排序
- 4. C#,如何按照自定义顺序对DataTable进行排序?
- 5. 如何按列表对Realm结果顺序进行排序?
- 6. 如何按给定顺序对列表进行排序?
- 7. 如何使用Linq对列表顺序进行排序?
- 8. 如何使用数组顺序对此集合进行排序?
- 9. 如何按字母顺序使用compareTo进行排序?
- 10. 如何按字典顺序对列表进行排序?
- 11. 如何按字典顺序对字符串进行排序?
- 12. 如何按时间顺序对Firebase数据库进行排序?
- 13. 如何从get_term_children按字母顺序对id进行排序?
- 14. 如何按顺序对HashSet()函数数据进行排序?
- 15. Perl - 如何按给定顺序对数组值进行排序?
- 16. 如何按特定顺序对SQLite表结果进行排序?
- 17. 如何以任意顺序对Perl列表进行排序?
- 18. 如何进行比较按字母顺序排序列表?
- 19. 如何按不同的顺序对每列进行排序?
- 20. 如何根据Windows电话的顺序对日期进行排序或排序
- 21. 如何通过自定义排序顺序对数组进行排序?
- 22. 如何使用指定属性和排序顺序对列表进行排序
- 23. 使用排序顺序进行排序XXX值SQL
- 24. MySQL按不同排序顺序对多列进行排序
- 25. 如何按字母顺序排序列表,并在同一顺序进行排序额外列出
- 26. matlab如何进行排序?
- 27. C# - 如何按字母顺序对文字UserValue进行排序和排列
- 28. 如何按顺序排序和排序顺序排列相同的列
- 29. 排序顺序
- 30. 排序顺序