如何将使用 table 模型的 for 循环转换为 lambda 表达式
How to turn a for loop using table models into a lambda expression
有没有办法把这个循环变成一个 Lambda 表达式?
我想从列中取出某些行并通过检查列表值是否为空或 'called' 来用它们填充列表。
我正在使用 C#。
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
List<String> list = new List<String>();
for (int i = 0; i < modl.RowCount+1; i++)
{
var listVal = modl.Model[i, col].Text;
if (listVal != "" && listVal != "Called")
{
list.Add(modl.Model[i, 9].Text);
}
}
return list;
}
谢谢
试试下面的代码:
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
return modl.Where(listVal => (!String.IsNullorEmpty(listVal.Text))
.Where(listVal => listVal.Text != "Called").Select(modl.Text).ToList();
}
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
List<String> list = Enumerable
.Range(0, modl.RowCount)
.Where(i => modl[i, col].Text != "" && modl[i, col].Text != "Called")
.Select(i => modl[i, 9].Text)
.ToList();
return list;
}
我们假设 modl.Model 是 SomeClass[][]...
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
return modl.Model.Where(a => a[col].Text != "" && a[col].Text != "Called")
.Select(a => a[9].Text)
.ToList();
}
我不知道 GridTableModel 的结构,但我想您可以轻松进行更改。
首先,您必须创建一个扩展来展平您的二维数组。
public static class ArrayLinq
{
public static IEnumerable<KeyValuePair<string, string>> Flatten(this string[,] map, int colcheck, int colvalue)
{
for (int row = 0; row < map.GetLength(0); row++)
{
yield return new KeyValuePair<string, string>(map[row, colcheck], map[row, colvalue]);
}
}
}
第一个参数是应用到您的 modl.Model,第二个是要检查的列,最后一个是要取件的列。我 return 一个 KeyValuePair,因为您需要列出要检查的列和要选择的列 (9) 作为值。但你可以随心所欲地改变它
那么你的函数应该变成这样
private IList<string> GetCurrentListRows(GridTableModel modl, int col)
{
return modl.Model.Flatten(col, 9)
.Where(x => !string.IsNullOrEmpty(x.Key) && x.Key != "Called")
.Select(x => x.Value)
.ToList();
}
这是一个很好的函数式编程 LINQ 练习。
有没有办法把这个循环变成一个 Lambda 表达式? 我想从列中取出某些行并通过检查列表值是否为空或 'called' 来用它们填充列表。
我正在使用 C#。
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
List<String> list = new List<String>();
for (int i = 0; i < modl.RowCount+1; i++)
{
var listVal = modl.Model[i, col].Text;
if (listVal != "" && listVal != "Called")
{
list.Add(modl.Model[i, 9].Text);
}
}
return list;
}
谢谢
试试下面的代码:
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
return modl.Where(listVal => (!String.IsNullorEmpty(listVal.Text))
.Where(listVal => listVal.Text != "Called").Select(modl.Text).ToList();
}
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
List<String> list = Enumerable
.Range(0, modl.RowCount)
.Where(i => modl[i, col].Text != "" && modl[i, col].Text != "Called")
.Select(i => modl[i, 9].Text)
.ToList();
return list;
}
我们假设 modl.Model 是 SomeClass[][]...
private List<String> GetCurrentListRows(GridTableModel modl, int col)
{
return modl.Model.Where(a => a[col].Text != "" && a[col].Text != "Called")
.Select(a => a[9].Text)
.ToList();
}
我不知道 GridTableModel 的结构,但我想您可以轻松进行更改。
首先,您必须创建一个扩展来展平您的二维数组。
public static class ArrayLinq
{
public static IEnumerable<KeyValuePair<string, string>> Flatten(this string[,] map, int colcheck, int colvalue)
{
for (int row = 0; row < map.GetLength(0); row++)
{
yield return new KeyValuePair<string, string>(map[row, colcheck], map[row, colvalue]);
}
}
}
第一个参数是应用到您的 modl.Model,第二个是要检查的列,最后一个是要取件的列。我 return 一个 KeyValuePair,因为您需要列出要检查的列和要选择的列 (9) 作为值。但你可以随心所欲地改变它
那么你的函数应该变成这样
private IList<string> GetCurrentListRows(GridTableModel modl, int col)
{
return modl.Model.Flatten(col, 9)
.Where(x => !string.IsNullOrEmpty(x.Key) && x.Key != "Called")
.Select(x => x.Value)
.ToList();
}
这是一个很好的函数式编程 LINQ 练习。