我有一个没有列的ListView控件。
列表
List<String> MyList=new List<string>();
我需要为MyList
中的每个列表ListView
项创建列,并为序列号创建另一列。
例如,如果MyList
包含"A", "B" ,"C"
然后列表视图就像
我知道我们可以使用for
或foreach
循环
listView1.Columns.Add("S.No")
for(int i=0;i<MyList.Count;i++)
{
listView1.Columns.Add(MyList[i])
}
但有没有办法使用LINQ
或LAMBDA Expression
?
答案 0 :(得分:5)
MyList.ForEach(name => listView1.Columns.Add(name));
答案 1 :(得分:4)
这里有4个选项
至少有另外10种方法可以做到这一点,
var myList = new List<string>() { "A", "B", "C" };
// 1: Modify original list and use List<>.ForEach()
myList.Insert(0, "S. No");
myList.ForEach(x => lisView.Columns.Add(x));
// 2: Add first column and use List<>.ForEach()
listView.Columns.Add("S. No");
myList.ForEach(x => listView.Columns.Add(x));
// 3: Don't modify original list
(new[] { "S. No" }).Concat(myList).ToList()
.ForEach(x => listView.Columns.Add(x));
// 4: Create ColumnHeader[] with Linq and use ListView.Columns.AddRange()
var columns = (new[] { "S. No"}).Concat(myList)
.Select(x => new ColumnHeader { Text = x }).ToArray();
listView.Columns.AddRange(columns);
您是否考虑过KISS选项?
答案 2 :(得分:0)
只是为了让Aliostad写的更清楚一点,以及这个答案下面的评论意味着什么:
所以你现在有这个代码:
listView1.Columns.Add("S.No")
for(int i=0;i<MyList.Count;i++)
{
listView1.Columns.Add(MyList[i])
}
正如您已经提到的,您也可以使用foreach
来编写它。这看起来像这样:
listView1.Columns.Add("S.No")
foreach(var item in MyList)
{
listView1.Columns.Add(item)
}
在第二个例子中,它也遍历列表。所有这一切都隐藏了本地索引变量i
。
在第三个例子中,你不会在需要动作的函数中隐藏这个迭代,该动作如何处理列表中的每个项目:
listView1.Columns.Add("S.No")
MyList.ForEach(name => listView1.Columns.Add(name));
在引擎盖下,它仍然遍历所有元素并在每个元素上执行一些功能。你不是自己编写循环,但这并不意味着它比你的方法更快或更好。这只是另一种(更短的)方式来告诉你想要实现的目标。