c#Linq - 检查列表中的多个

时间:2017-01-08 10:32:02

标签: c# linq

我有一个交易清单,我需要查找是否有超过1个帐户

我做了

   var MultipleAccounts = list.GroupBy(t => t.AccountId).Count() > 1;

有更好的方法吗?

3 个答案:

答案 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