試圖根據兩個單元格中的字串將一行拆分為多行。它類似于 LINQ 將行的列值分隔到 .net 中的不同行的問題, 但我需要根據產品和成本列而不是僅產品列進行拆分
| 編號 | 產品 | 成本 |
|---|---|---|
| 1 | 高露潔,特寫,pepsodent | 50,100,150 |
| 2 | 林,沖浪 | 100 |
進入
| 編號 | 產品 | 成本 |
|---|---|---|
| 1 | 高露潔 | 50 |
| 1 | 特寫 | 100 |
| 1 | 胃病 | 150 |
| 2 | 凜 | 100 |
| 2 | 沖浪 | 100 |
我正在使用帶有物體框架的 Linq to Object
uj5u.com熱心網友回復:
試試下面的。由于您沒有提供任何模型,因此名稱可能不準確。
var loaded = ctx.Products.ToList();
var query =
from p in loaded
from sp in p.Product.Split(',').Zip(p.Cost.Split(','), (p, c) => (p, c))
select new
{
Sno = p.Sno,
Product = sp.p,
Cost = sp.c
};
var splitted = query.ToList();
uj5u.com熱心網友回復:
使用@SvyatoslavDanyliv 命名,這是一個答案:
var loaded = ctx.Products.ToList();
var query =
from p in loaded
from sp in p.Product.Split(',').Zip(p.Cost.Split(','), (p, c) => (p, c))
select new
{
Sno = p.Sno,
Product = sp.p,
Cost = sp.c
};
var splitted = query.ToList();
我覺得有點復雜。我更喜歡使用擴展方法來創建一個變體,Zip它重復較短序列的最后一個元素以匹配較長的序列:
public static class EnumerableExt {
public static IEnumerable<(T1 First,T2 Second)> ZipExtend<T1,T2>(this IEnumerable<T1> s1, IEnumerable<T2> s2) {
var s1e = s1.GetEnumerator();
var s2e = s2.GetEnumerator();
T1 s1eLast = default;
T2 s2eLast = default;
bool has_s2 = false;
if (s1e.MoveNext()) {
do {
s1eLast = s1e.Current;
if (s2e.MoveNext()) {
s2eLast = s2e.Current;
has_s2 = true;
}
else if (!has_s2)
yield break;
yield return (s1eLast, s2eLast);
} while (s1e.MoveNext());
if (has_s2)
while (s2e.MoveNext())
yield return (s1eLast, s2e.Current);
}
yield break;
}
}
那么答案是:
var query =
from p in loaded
from pr in p.Product.Split(',').ZipExtend(p.Cost.Split(','))
select new
{
Sno = p.Sno,
Product = pr.First,
Cost = pr.Second
};
var splitted = query.ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456791.html
