Lambda表达式 - 连接当前值和下一个值

时间:2013-12-30 00:52:11

标签: c# linq lambda

我有一个列表,我正在尝试连接当前和下一个。虽然我可以通过项目[索引] +项目[索引+1]轻松再次使用For循环执行此操作,但我想尝试使用LINQ。

我尝试使用Aggregate和Next运算符,但他们给了我整个Concatination。

if i have a List<string> ListSalary  that has value like 
"10000"
"20000"
"30000"
"40000"

I am looking for a output like 

"10,000 - 20,000"
"20,000 - 30,000"
"30,000 - 40,000"

我的Forloop是

for (int index = 1; index < (ListSalary.Count - 1); index++) {
    txtSalary.text = ListSalary[index].valueName.ToString() + " To " + ListSalary[index +1].valueName.ToString() ;
}

更新的问题:

这是给我一份清单。如果我想添加类似

的内容,我无法将其分配给Class属性
listSalaryProperty.AddRange(ListSalary.select(g=> new KeyValuePair
                        { 
                            key =  //  Here i want the 10,000 - 20,000
                            Value = // here it would be code value which  already have 
}

因此,如果我使用代码段

,请点击此处
key = ListSalary.Zip(ListSalary.Skip(1), (a, b) => string.Format("{0} - {1}", a, b))
            .ToList();

它会抛出将列表转换为字符串

的错误

3 个答案:

答案 0 :(得分:2)

使用LINQ,您可以在同一个集合上使用Zip,但没有第一个元素,因此您可以访问当前和以前的值:

var res = ListSalary.Zip(ListSalary.Skip(1), 
                         (a, b) => string.Format("{0} - {1}", a, b))
                    .ToList();

如果你想把它投射到KeyValuePair,你可以写:

listSalaryProperty.AddRange(
   ListSalary.Zip(ListSalary.Skip(1), 
                  (a, b) => new KeyValuePair<string, object>( 
                                                string.Format("{0} - {1}", a, b),
                                                /** your code **/)))

但是将object更改为您的类型并添加您的代码以便当然计算价值。

答案 1 :(得分:0)

ListSalary.Take( ListSalary.Count - 1 )
    .Select( (item, index) => string.Format( "{0} - {1}", item, ListSalary[index+1] ) )

答案 2 :(得分:0)

listSalaryProperty.AddRange(
    ListSalary.Zip(ListSalary.Skip(1),
                   (a, b) => new
                             {
                                 From = a,
                                 To = b,
                                 Text = string.format("{0} - {1}", a, b)
                             }
             ).Select(g => new KeyValuePair<string, YourValueType>(
                                   g.Text,
                                   /* value code here */
                               )));

KeyValuePair是不可变的,因此您无法使用对象初始化语法来初始化ValueKey属性(它们是只读的)。你必须使用构造函数。将YourValueType更改为与您的值匹配的正确类型。

您可以使用g.Fromg.Tog.Text(包含XXX - YYY字符串)来生成Value