让我们假设我有一个列表,其中包含缺少值的元素,但匹配id(可能缺少或不匹配id),因此我希望将不为空或不为空的值放入单个元素中,如果有几个值不为空,则在匹配的字段名中转换为IGrouping/list,如果没有,则转换为单个空值,
这是一个例子
public class MyClass
{
public int vali;
public string vala;
public string valb;
public long? vall;
} var list = new List<MyClass>()
{
new MyClass(){vali= 2,vala=null,valb="how are you",vall=7},
new MyClass {vali=3,vala="hi",valb="how are you doing",vall=null},
new MyClass{vali=2,vala="hello",valb="how are you",vall=null},
new MyClass{vali=3,vala=null,valb=null,vall=8},
new MyClass(){vali= 2,vala=null,valb=null,vall=7},
};我想得到以下输出
{2,"hello",string[] {"how are you","how are you" },int[] {7,7} }
{3 , "hi" , "how are you doing" ,8 },使用linq
list.GroupBy(x=>x.vali).Select(x=>x.FirstOrDefault()).ToList();返回
{2,"how are you",null,7},
{3, "how are you doing",null}那么,我可以使用什么查询,或者如何实现返回列表(或者像linq那样使用IGrouping,但编写自己的算法)
谢谢
发布于 2022-01-22 07:25:55
有些值具有数组,而另一些值只有一个值,因此不能获得混合输出。一切都是这样或那样。
在我看来,这做了你想做的事:
var result =
list
.GroupBy(x => x.vali)
.Select(gxs => new
{
vali = gxs.Key,
vala = gxs.Select(gx => gx.vala).Where(x => x != null).ToList(),
valb = gxs.Select(gx => gx.valb).Where(x => x != null).ToList(),
vall = gxs.Select(gx => gx.vall).Where(x => x != null).ToList(),
})
.ToList();我得到:

否则,要获得单个值,请尝试如下:
List<MyClass> result =
list
.GroupBy(x => x.vali)
.Select(gxs => new MyClass()
{
vali = gxs.Key,
vala = gxs.Select(gx => gx.vala).Aggregate((x, y) => x ?? y),
valb = gxs.Select(gx => gx.valb).Aggregate((x, y) => x ?? y),
vall = gxs.Select(gx => gx.vall).Aggregate((x, y) => x ?? y),
})
.ToList();使用您的数据,我得到了以下结果:

发布于 2022-01-21 16:30:31
尝试以下几个方面:
class Program
{
static void Main(string[] args)
{
var list = new List<MyClass>()
{
new MyClass(){vali= 2,vala=null,valb="how are you",vall=7},
new MyClass {vali=3,vala="hi",valb="how are you doing",vall=null},
new MyClass{vali=2,vala="hello",valb="how are you",vall=null},
new MyClass{vali=3,vala=null,valb=null,vall=8},
new MyClass(){vali= 2,vala=null,valb=null,vall=7},
new MyClass(){vali= 2,vala=null,valb="how are you",vall=7},
new MyClass {vali=3,vala="hi",valb="how are you doing",vall=null},
new MyClass{vali=2,vala="hello",valb="how are you",vall=null},
new MyClass{vali=3,vala=null,valb=null,vall=8},
new MyClass(){vali= 2,vala=null,valb=null,vall=7},
};
var results = list.GroupBy(x => x).ToList();
}
}
public class MyClass : IEquatable<MyClass>
{
public int vali;
public string vala;
public string valb;
public long? vall;
public bool Equals(MyClass other)
{
return
(this.vali == other.vali) &&
(this.vala == other.vala) &&
(this.valb == other.valb) &&
(this.vall == other.vall);
}
public override bool Equals(object obj)
{
return Equals(obj as MyClass);
}
public override int GetHashCode()
{
return (this.vali.ToString() + "^" + this.vala + "^" + this.valb + "^" + this.vall.ToString()).GetHashCode();
}
}发布于 2022-01-22 07:02:36
我想我找到了我想要的
使用以下查询
var
list2=list.ToDictionary(x=>x).GroupBy(x=>x.Key.vali).Select(x=>new {
vali = x.First().Key.vali,
vala = x.Count(v => v.Value.vala !=null) > 0 ?x.Where(x=>x.Value.vala!=null).Select(x=>x.Value.vala).ToList() : new List<string> { x.FirstOrDefault(x=>x.Value.vala!=null).Value.vala },
valb = x.Count(v => v.Value.valb !=null) > 0 ?x.Where(x=>x.Value.valb!=null).Select(x=>x.Value.valb).ToList() : new List<string> { x.FirstOrDefault(x=>x.Value.valb!=null).Value.valb },
vall = x.Count(v => v.Value.vall !=null) > 0 ?x.Where(x=>x.Value.vall!=0).Select(x=>x.Value.vall).ToList() : new List<long?> { x.FirstOrDefault(x=>x.vall!=null).Value.vall },
}).ToList();https://stackoverflow.com/questions/70803984
复制相似问题