gpt4 book ai didi

c# - 部分不同的 Linq

转载 作者:行者123 更新时间:2023-11-30 13:36:52 24 4
gpt4 key购买 nike

我有一个对象列表。这些对象有一个属性,例如“值(value)”。

       var lst = new List<TestNode>();

var c1 = new TestNode()
{
Value = "A",
};

lst.Add(c1);

var c2 = new TestNode()
{
Value = "A",
};

lst.Add(c2);

var c3 = new TestNode()
{
Value = "B",
};

lst.Add(c3);

var c4 = new TestNode()
{
Value = "B",
};

lst.Add(c4);

我想说的是:

lst.PartialDistinct(x => x.Value == "A")

这应该只能通过谓词来区分,并且在打印结果 IEnumerable 的“值”时,结果应该是:

A
B
B

我已经为 DistinctBy 找到了可以定义键选择器的解决方案。但结果当然是:

A
B

Cyral 的第一个回答完成了这项工作。所以我接受了。但是 Scott 的回答实际上是一个 PartialDistinct() 方法,看起来它解决了我所有的问题。

好吧,以为用 Scott 的解决方案就解决了,但事实并非如此。也许我在单元测试时犯了一个错误......或者我不知道。问题是:

if(seen.Add(item)) 

这不会过滤掉其他值为“A”的对象。我认为这是因为它在放入 hashset 时依赖于引用相等性。

我最终得到了以下解决方案:

public static IEnumerable<T> PartialDistinct<T>(this IEnumerable<T> source Func<T, bool> predicate)
{
return source
.Where(predicate)
.Take(1)
.Concat(source.Where(x => !predicate(x)));
}

最佳答案

您可以按 Value 分组并使用 SelectMany 执行“条件扁平化”,即只从“A”组中取出一个元素,所有来自其余组的元​​素:

var result = lst.GroupBy(x => x.Value)
.SelectMany(g => g.Key == "A" ? g.Take(1) : g);

关于c# - 部分不同的 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com