如何在C#中将列标题添加到ListView

时间:2010-11-02 12:00:31

标签: c# linq listview lambda

我有一个没有列的ListView控件。

列表

List<String> MyList=new List<string>();

我需要为MyList中的每个列表ListView项创建列,并为序列号创建另一列。

例如,如果MyList包含"A", "B" ,"C"

然后列表视图就像

alt text

我知道我们可以使用forforeach循环

来执行此操作
listView1.Columns.Add("S.No")
for(int i=0;i<MyList.Count;i++)
   {
      listView1.Columns.Add(MyList[i])
   }

但有没有办法使用LINQLAMBDA Expression

执行此操作

3 个答案:

答案 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));

在引擎盖下,它仍然遍历所有元素并在每个元素上执行一些功能。你不是自己编写循环,但这并不意味着它比你的方法更快或更好。这只是另一种(更短的)方式来告诉你想要实现的目标。