我提供了如下的簡單串列:
var records = new List<BookRecord> {
new() {
Author = "Peter",
BookName = "Book A"
},
new() {
Author = "",
BookName = "Book B"
},
new() {
Author = "Peter",
BookName = "Book C"
},
new() {
Author = "James",
BookName = ""
},
new() {
Author = "",
BookName = "Book D"
},
new() {
Author = "James",
BookName = ""
},
new() {
Author = "",
BookName = "Peter"
}
};
我只想分組 author 不為空(或其他條件),剩下的需要保留在 result 中,所以我的預期結果是:
[
{"Author":"Peter","BookName":"Book A"},
{"Author":"","BookName":"Book B"},
{"Author":"James","BookName":""},
{"Author":"","BookName":"Book D"},
{"Author":"","BookName":"Peter"}
]
并且需要訂購(這意味著“詹姆斯”應該是第 3 行,最后一個必須是{"Author":"","BookName":"Peter"}
我能知道怎么做嗎?
謝謝
uj5u.com熱心網友回復:
據我所知,你想要
- 如果
Author設定(不是空字串)只回傳他/她的第一本書。 - 如果
Author未設定,則回傳記錄。
如果是你的情況,你可以GroupBy跟著Select First:
int index = 0;
var result = source
.GroupBy(item => (item.Author, string.IsNullOrEmpty(item.Author) ? index : 0))
.Select(group => group.First())
.ToList(); // if you want it as a list
訣竅是讓所有空的組Author都是唯一的,我們在index.
如果我們不想使用副作用,index我們可以利用相同的想法,但查詢時間更長:
var result = source
.Select((value, index) => (value, index))
.GroupBy(pair => (pair.value.Author, string.IsNullOrEmpty(pair.value.Author)
? pair.value.index
: 0),
pair => pair.value)
.Select(group => group.First())
.ToList(); // if you want it as a list
uj5u.com熱心網友回復:
嘿你可以用這個:)
var filteredRecords = records
.Where(x => x.Author != "") //condition
.OrderBy(x=> x.Author) // Order by
.ToList();
結果將是
Author :James - BookName:
Author :James - BookName:
Author :Peter - BookName: Book A
Author :Peter - BookName: Book C
此處的示例代碼https://dotnetfiddle.net/cxYVTY
uj5u.com熱心網友回復:
嘗試這個
var data = records.GroupBy(
g=> string.IsNullOrEmpty(g.Author)?
$"{g.Author}-{g.BookName}"
:g.Author)
.Select(s=>s.First());
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521690.html
標籤:C#林克分组
