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. 排序順序