假設我有一個串列,其中包含缺少值但匹配 id 的元素(可能會或可能不會丟失,所以我想將非 null 或空的值放入單個元素中,在匹配的欄位名稱中進行轉換如果有多個非空值或單個空值(如果沒有),則到 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 但撰寫我自己的演算法)
謝謝
uj5u.com熱心網友回復:
您無法獲得某些值具有陣列而其他值具有單個值的混合輸出。這都是一種或另一種方式。
在我看來,這可以滿足您的要求:
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();
使用您的資料,我得到以下結果:

uj5u.com熱心網友回復:
嘗試以下:
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();
}
}
uj5u.com熱心網友回復:
我想我找到了我想要的
使用以下查詢
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().Value.vall },
}).ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419497.html
標籤:
下一篇:將SQL查詢轉換為LINQ運算式
