C# 如何从列表中添加数据<;列表<;字符串>&燃气轮机;添加到列表视图

C# 如何从列表中添加数据<;列表<;字符串>&燃气轮机;添加到列表视图,c#,winforms,linq,listview,C#,Winforms,Linq,Listview,我有一个列表MyList,其中包含 { "A1","B1","C1" } { "A2","B2","C2" } { "A3","B3","C3" } 我需要将其添加到具有三列的ListView控件中 因此列表视图如下所示 __Clm1________________Clm2________________Clm3_______________ A1 A2 A2 B1

我有一个
列表
MyList,其中包含

    { "A1","B1","C1" }
    { "A2","B2","C2" }
    { "A3","B3","C3" }
我需要将其添加到具有三列的ListView控件中

因此列表视图如下所示

__Clm1________________Clm2________________Clm3_______________

   A1                  A2                 A2
   B1                  B2                 B3
   C1                  C2                 C3
___S.No __Clm1________________Clm2________________Clm3_______________
   1      A1                  A2                 A2
   2      B1                  B2                 B3
   3      C1                  C2                 C3
使用LINQ有什么方法可以做到这一点吗

编辑以下是我的解决方案:

ListViewItem[] lItem = MyList.Select(
                                          X => new ListViewItem(X.ToArray())
                                    ).ToArray();
listView1.Items.AddRange(lItem);
但这里我需要添加一个索引。。。。列表视图如下所示

__Clm1________________Clm2________________Clm3_______________

   A1                  A2                 A2
   B1                  B2                 B3
   C1                  C2                 C3
___S.No __Clm1________________Clm2________________Clm3_______________
   1      A1                  A2                 A2
   2      B1                  B2                 B3
   3      C1                  C2                 C3

如何将索引添加到列表视图?

是。。我有个解决办法。。。。给你

int i=1;
ListViewItem[] lItem =MyList.Select(X=> new ListViewItem(new String[]{i++.ToString()}.Concat(X).ToArray())).ToArray(); 
listView1.Items.AddRange(lItem); 

使用带索引的
Select
重载:

var rows = new List<List<string>>()
{
    new List<string>(){ "A1","B1","C1" },
    new List<string>(){ "A2","B2","C2" },
    new List<string>(){ "A3","B3","C3" },
};

listView1.Items.AddRange(
    rows.Select(
        (row, index) => new ListViewItem(
            new[] { index.ToString() }
                .Concat(row)
                .ToArray()
            )
        )
        .ToArray()
    );
var行=新列表()
{
新列表(){“A1”、“B1”、“C1”},
新列表(){“A2”、“B2”、“C2”},
新列表(){“A3”、“B3”、“C3”},
};
listView1.Items.AddRange(
行。选择(
(行,索引)=>新建ListViewItem(
新[]{index.ToString()}
.Concat(世界其他地区)
.ToArray()
)
)
.ToArray()
);
我个人会使用不同的样式(本地委托,或扩展方法+流畅的语法),因为我真的不喜欢内联调用ToArray,但这与您将得到的内置样式非常接近:)


如果您对extension method+fluent syntax选项感兴趣,请参阅我的其他答案。

我个人认为这一点更清晰:

var myList = new List<List<string>>()
{
    new List<string>(){ "A1","B1","C1" },
    new List<string>(){ "A2","B2","C2" },
    new List<string>(){ "A3","B3","C3" },
};

listView.BeginUpdate();    
foreach (var row in myList)
{
    var item = new ListViewItem(listView.Items.Count.ToString());
    item.SubItems.AddRange(row);
    listView.Items.Add(item);
}
listView.EndUpdate();
var myList=new List()
{
新列表(){“A1”、“B1”、“C1”},
新列表(){“A2”、“B2”、“C2”},
新列表(){“A3”、“B3”、“C3”},
};
BeginUpdate();
foreach(myList中的var行)
{
var item=newlistViewItem(listView.Items.Count.ToString());
item.SubItems.AddRange(行);
listView.Items.Add(item);
}
EndUpdate();

如果您经常使用类似的
列表视图
控件,那么添加一些简单的扩展方法可能是值得的:

public static class ListViewExtensions
{
    public static ListView AddItems(this ListView listView,
        IEnumerable<ListViewItem> items)
    {
        listView.Items.AddRange(items.ToArray());
        return listView;
    }

    public static ListViewItem WithSubItems(this ListViewItem item,
        IEnumerable<string> subItems)
    {
        item.SubItems.AddRange(subItems.ToArray());
        return item;
    }
}
公共静态类ListViewExtensions
{
公共静态ListView附加项(此ListView ListView,
(可数项目)
{
listView.Items.AddRange(Items.ToArray());
返回列表视图;
}
带有子项的公共静态ListViewItem(此ListViewItem,
IEnumerable子项)
{
item.SubItems.AddRange(SubItems.ToArray());
退货项目;
}
}
生成的代码变得非常简洁明了:

var rows = new List<List<string>>()
{
    new List<string>(){ "A1","B1","C1" },
    new List<string>(){ "A2","B2","C2" },
    new List<string>(){ "A3","B3","C3" },
};

listView1.AddItems(
    rows.Select(
        (row, index) => new ListViewItem(index.ToString())
            .WithSubItems(row)
        )
    );
var行=新列表()
{
新列表(){“A1”、“B1”、“C1”},
新列表(){“A2”、“B2”、“C2”},
新列表(){“A3”、“B3”、“C3”},
};
listView1.AddItems(
行。选择(
(行,索引)=>新建ListViewItem(index.ToString())
.带SUBITEMS(世界其他地区)
)
);

为什么不直接将每一行添加到listview中,而不是首先构建一个新数组?@jgauffin:在实际场景中,变量
blah
来自于稀薄的空气(另一个函数)。它实际上并不像我这里的例子那样是内联的。此示例用于显示如何对
AddRange
行进行编码。另外,如果您正在谈论我为什么需要
ToArray()
,这是因为
AddRange
方法和
ListViewItem
构造函数采用数组,而不是
IEnumerable
@jgauffin:当然,您可以始终使用foreach循环;)他的另一个问题是“如何在LINQ中执行X”(如何将
XDocument
转换为他在这个问题开始时拥有的
List
),因此我认为他需要内嵌式/声明式/“LINQ风格”答案。我的意思是,
listView1.Items.AddRange
可以替换为
listView1.Items.Add
遍历
blah