有没有一种简单的方法可以直接使用 Lists 或 Linq Lambda 表达式?
也许,这样做是否明智?可能不是。您的代码将难以理解,无法进行单元测试,代码可能无法重用,小改动也很困难。
但让我们首先以一个 LINQ 语句的形式回答您的问题:
const char separatorChar = ' ';
IEnumerable<string> inputText = ...
var result = inputtext.Split(separatorChar)
.Select(text => Int32.Parse(text))
.Select(numbers => new
{
Id = numbers.First()
Sum = numbers.Skip(1).Sum(),
});
不可重用、难以单元测试、难以更改、效率不高,是否需要更多参数?
最好有一个过程,将一个输入字符串转换为包含输入字符串真正表示的内容的适当对象。
唉,你没有告诉我们每个输入字符串是否包含三个整数,其中一些可能包含无效文本,而一些可能包含多于或少于三个整数。
你忘了告诉使用你的输入字符串代表什么。
所以我就编一个标识符:
class ProductSize
{
public int ProductId {get; set;} // The first number in the string
public int Width {get; set;} // The 2nd number
public int Height {get; set;} // The 3rd number
}
你需要一个静态过程,输入一个字符串,输出一个 ProductSize:
public static ProductSize FromText(string productSizeText)
{
// Todo: check input
const char separatorChar = ' ';
var splitNumbers = productSizeText.Split(separatorChar)
.Select(splitText => Int32.Parse(splitText))
.ToList();
return new ProductSize
{
ProductId = splitNumbers[0],
Width = splitNumbers[1],
Height = splitNumbers[2],
};
}
我需要根据第一个数字 (ID) 进行计数,并将此 ID 的结果值相加
创建方法 ParseProductSize 后,这很容易:
IEnumerable<string> textProductSizes = ...
var result = textProductSizes.Select(text => ProductSize.FromText(text))
.Select(productSize => new
{
Id = productSize.Id,
Sum = productSize.Width + productSize.Height,
});
如果您的字符串并不总是包含三个数字
如果你不总是三个数字,那么你就不会有宽度和高度,而是一个属性:
IEnumerable<int> Numbers {get; set;} // TODO: invent proper name
在 ParseProductSize 中:
var splitText = productSizeText.Split(separatorChar);
return new ProductSize
{
ProductId = Int32.Parse(splitText[0]),
Numbers = splitText.Skip(1)
.Select(text => Int32.Parse(text));
我故意将其保留为 IEnumerable,因此如果您不使用所有数字,您将不会白白解析数字。
LINQ:
var result = textProductSizes.Select(text => ProductSize.FromText(text))
.Select(productSize => new
{
Id = productSize.Id,
Sum = productSize.Numbers.Sum(),
});