如何在 Linq 的单个查询中使用 Distinct() 和 Sum()
How to Use Distinct() and Sum() in Single Query in Linq
这里我有 2 列,例如
编号,数量。我想在 LINQ 中获取 Distinct Id 及其数量总和。
我试过这样
var r = list.Where(some operation)
.Select(x => x.Id)
.Distinct()
.Select(x => (int?)x.Quantity))
.Sum();
这里 x.Quantity 我遇到了错误..我该如何解决..
请提出您的建议
按 Id 分组。比你能做的:
.GroupBy(x => x.Id)
.Select(x => new { x.Key, x.Sum(y => (int?)y.Quantity) });
如果我假设 Id 是 int 并且 Quantity 是 string,那么您也可以使用聚合。下面是一个例子:
class TestClass
{
public int I { get; set; }
public string S { get; set; }
}
class Program
{
static void Main()
{
var myclass = new TestClass[]
{
new TestClass {I = 1, S = "1"}, new TestClass { I = 1, S = "11" }, new TestClass { I = 1, S = "111" },
new TestClass {I = 2, S = "2"},new TestClass {I = 2, S = "222"},new TestClass {I = 2, S = "2"},
new TestClass {I = 3, S = "3"},new TestClass {I = 3, S = "333"},new TestClass {I = 3, S = "33"},
new TestClass {I = 4, S = "44"},new TestClass {I = 4, S = "4"},
new TestClass {I = 5, S = "5"}
};
var filteredObject = myclass.GroupBy(x => x.I).Select(y => new
{
I = y.Key,
S = y.Select(z => z.S).Aggregate((a, b) => (Convert.ToInt32(a) + Convert.ToInt32(b)).ToString())
});
filteredObject.ToList().ForEach(x => Console.WriteLine(x.I + " " + x.S));
}
}
结果如下:
1 123
2226
3 369
4 48
5 5
按任意键继续。 . .
希望对您有所帮助。
这里我有 2 列,例如 编号,数量。我想在 LINQ 中获取 Distinct Id 及其数量总和。 我试过这样
var r = list.Where(some operation)
.Select(x => x.Id)
.Distinct()
.Select(x => (int?)x.Quantity))
.Sum();
这里 x.Quantity 我遇到了错误..我该如何解决.. 请提出您的建议
按 Id 分组。比你能做的:
.GroupBy(x => x.Id)
.Select(x => new { x.Key, x.Sum(y => (int?)y.Quantity) });
如果我假设 Id 是 int 并且 Quantity 是 string,那么您也可以使用聚合。下面是一个例子:
class TestClass
{
public int I { get; set; }
public string S { get; set; }
}
class Program
{
static void Main()
{
var myclass = new TestClass[]
{
new TestClass {I = 1, S = "1"}, new TestClass { I = 1, S = "11" }, new TestClass { I = 1, S = "111" },
new TestClass {I = 2, S = "2"},new TestClass {I = 2, S = "222"},new TestClass {I = 2, S = "2"},
new TestClass {I = 3, S = "3"},new TestClass {I = 3, S = "333"},new TestClass {I = 3, S = "33"},
new TestClass {I = 4, S = "44"},new TestClass {I = 4, S = "4"},
new TestClass {I = 5, S = "5"}
};
var filteredObject = myclass.GroupBy(x => x.I).Select(y => new
{
I = y.Key,
S = y.Select(z => z.S).Aggregate((a, b) => (Convert.ToInt32(a) + Convert.ToInt32(b)).ToString())
});
filteredObject.ToList().ForEach(x => Console.WriteLine(x.I + " " + x.S));
}
}
结果如下:
1 123
2226
3 369
4 48
5 5
按任意键继续。 . .
希望对您有所帮助。