我有一个交易清单,我需要查找是否有超过1个帐户
我做了
var MultipleAccounts = list.GroupBy(t => t.AccountId).Count() > 1;
有更好的方法吗?
答案 0 :(得分:2)
如果您愿意丢失单行,我更喜欢使用!.All(item => bool)
或.Any(item => bool)
,因为我认为它是最具语义性和最容易阅读的内容,作为最快的候选人。
var accountId = accounts[0].AccountId;
var hasMultipleAccounts = !accounts.All(account => account.AccountId == accountId);
或者,甚至可能更加语义上,您可以使用.Any(item => bool)
代替.All(item => bool)
。
var accountId = accounts[0].AccountId;
var hasMultipleAccounts = accounts.Any(account => account.AccountId != accountId);
要注意的事项是确保您至少有一个项目(以便帐户[0]不会失败)并且不会对您的IEnumerable进行多次枚举。你说你正在使用List,所以多次枚举不应该给你带来任何麻烦,但是当你只有一个未知的IEnumerable时,要小心这一点非常重要。
答案 1 :(得分:1)
好的,我发现最快的
public bool HasMultipleAccounts(List<Account> list)
{
foreach (var account in list)
if (account.AccountId != list[0].AccountId)
return true;
return false;
}
用法:var MultipleAccounts = HasMultipleAccounts(list);
致谢:@hvd
我知道它的代码更多,但如果你认为cpu需要做什么最快
答案 2 :(得分:0)
我更喜欢:
var MultipleAccounts = list.Select(t => t.AccountId).Distinct().Skip(1).Any();
这应该非常快,因为它会在找到第二个list
时停止迭代源AccountId
。
无论何时执行完整的.Count()
,都必须迭代完整的源列表。
您可以使用以下代码对此进行测试:
void Main()
{
Console.WriteLine(Data().Select(t => t).Distinct().Skip(1).Any());
}
private Random __random = new Random();
public IEnumerable<int> Data()
{
while (true)
{
var @return = __random.Next(0, 10);
Console.WriteLine(@return);
yield return @return;
}
}
典型的运行如下:
7 9 True