我想根據串列中的多個索引動態分組。
模型
public class MyModel
{
public string baseTableName { get; set; }
public List<object> columns { get; set; }
public List<List<object>> rows { get; set; }
}
我需要在這個模型中找到 pk 列串列的索引。然后我想按 pk 列對行串列中的資料進行分組。
樣品請求
{
"tableName": "fooTable",
"columns": [
"c1",
"c2",
"c3"
],
"rows": [
[
"1",
"a",
"kobe"
],
[
"2",
"a",
"lebron"
]
]
}
在此示例請求中,c1 和 c2 列是 pk。
代碼
// Returns indexes of pk columns.
var pkColumnIndexes = GetPkIndexes(columns);
var gp = requestObject.rows.GroupBy(gp => new { indx1 = gp[pkColumnIndexes[0]], indx2 = gp[pkColumnIndexes[1]] });
var groupData = gp.Select(s => s.LastOrDefault()).ToList();
--
(gp => new { indx1 = gp[pkColumnIndexes[0]], indx2 = gp[pkColumnIndexes[1]] } )
我想根據索引對這部分進行分組。
可以使用 for 回圈動態創建的按鍵分組嗎?
uj5u.com熱心網友回復:
使用IEqualityComparerfor 序列,您可以創建序列鍵并按它們分組:
public static class Make {
public static IEqualityComparer<IEnumerable<T>> IESequenceEqual<T>() => new IEnumerableSequenceEqualityComparer<T>();
public static IEqualityComparer<IEnumerable<T>> IESequenceEqual<T>(T _) => new IEnumerableSequenceEqualityComparer<T>();
private class IEnumerableSequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>> {
public bool Equals(IEnumerable<T> x, IEnumerable<T> y) =>
Object.ReferenceEquals(x, y) || (x != null && y != null && (x.SequenceEqual(y)));
public int GetHashCode(IEnumerable<T> items) {
// Will not throw an OverflowException
//unchecked {
// return items.Where(e => e != null).Select(e => e.GetHashCode()).Aggregate(17, (a, b) => 23 * a b);
//}
var hc = new HashCode();
foreach (var item in items)
hc.Add(item);
return hc.ToHashCode();
}
}
}
var IEObjSeqEq = Make.IESequenceEqual<string>();
var ans = requestObject.rows.GroupBy(r => pkColumnIndexes.Select(idx => r[idx].ToString()), IEObjSeqEq);
請注意,您必須顯式轉換為string以避免object.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494198.html
