2015-11-26 68 views

回答

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; 
    } 
} 
相关问题