2017-02-08 4 views
-2

「ColumnNameに」:列名は以下のように含むDataTableの列のインデックスを取得する方法私は列を含むDataTableを動的に作成した

Name | Role | Comm w1 | Role | Comm w2 | .... | Total Comm | 

私はCommが含まれているすべての列のインデックスを取得したいです。

期待される結果は次のようになります。

2 
4 
... 
+4

試したコードを入力してください。私たちは**あなたのためにあなたの仕事をしない** **に**ここにあります。 –

答えて

1

あなたの質問は、画面の列の位置を印刷するか、後で使用するために保存するかによって、出力をどのようにするかは不明です。

さらに、これは非常に簡単な解決策です。もしそれがなければ、私は参加しないでしょう。将来の参照のために、あなたが試したものと期待しているものを提供してください。それは、あなたが解決策を見つけるのを手助けしようとすることに関わるすべての人に役立ちます。何か問題が発生した場合は、"How to ask a good question"を参照してください。

using System; 
using System.Data; 
using System.Xml; 

public class Program 
{ 
    public static void Main() 
    { 
     var dt = new DataTable { Columns = { "Name", "Role", "Comm w1", "Comm w2", "Total Comm"}}; 


     foreach(DataColumn column in dt.Columns){ 
      if(column.ColumnName.Contains("Comm")){ 
       Console.WriteLine(column.Ordinal.ToString()); 
      } 
     } 
    } 
} 


// Output: 

// 2 
// 3 
// 4 

これが役立つかどうか教えてください。

+0

あなたの答えをありがとう。私は簡単な質問ですが、私はColumnNameを含む列のインデックスを取得する方法についてのみ尋ねています。これを達成した後、私はそれらを印刷するか、リストに格納するかどうかを決めることができますが、問題にはなりません。 –

0

以下は、あなたが

foreach (DataColumn col in dataTable.Columns) 
{ 
     if (col.ColumnName.Contains("Comm")) 
     { 
     var index = col.Ordinal;   
     } 
} 

必要なものを行う必要があります。しかし述べたように、あなたが最初に何かをしようとすると、それがベストです。

+0

これはあまりうまくいかないので、変数はループの外で宣言し、おそらくリストになるようにして、 'listIndex.add(col.Ordinal); 'を使用します。スコープの問題のためにifが終了するとすぐにインデックスが失われます。 – Andrew

+0

@Andrewユーザーが望んだことに基づいて、値をすべて格納する必要はありません。OPは、画面に印刷された列のインデックス位置を望みます。*可能な*さらなる操作のために保存されません。 –

+0

@BviLLe_Kidここでは正直言って質問は最高のものとはかけ離れているが、出力ニーズは決して決して決まっていないが、Wheels73の解決法は出力も保存もせず、範囲が存在する限り値を設定するこれは長くない。 – Andrew

0

その他の回答は正しいですが、それはあなたに求めているものを手に入れますが、どのように使用するのかはまったく正しいとは思いません。私は次のようなことをします:

List<int> indexes = new List<int>(); 
foreach (DataColumn column in dataTable.Columns) 
{ 
    if (column.ColumnName.Contains("Comm")) 
    { 
     indexes.Add(column.Ordinal);   
    } 
} 

このようにして、後であなたが望むようにインデックスのリストを持っています。

4

LINQを使用すると、これを簡単に行うことができます。

LINQにはIEnumerable<DataColumn>が必要ですが、列はDataColumnCollectionであるため、最初に列をDataColumnにキャストする必要があります。その後、列を "Comm"を含むものに収縮させ、各列の順序を選択して、それをリストにします。

List<int> columnIndexes = dt.Columns.Cast<DataColumn>() 
    .Where(column => column.ColumnName.Contains("Comm")) 
    .Select(column => column.Ordinal).ToList(); 
関連する問題