2017-01-18 18 views
3

私は列データ型が文字列であるdatatableを持っています。文字列値を持つデータテーブル内の整数項目を検索

DataTable dt = new DataTable(); 
dt.Columns.Add("LowerRange", typeof(string)); 
dt.Columns.Add("UpperRange", typeof(string)); 
DataRow dr = dt.NewRow(); 
dr["LowerRange"] = "1,2,3,4,5"; 
dr["UpperRange"] = "55"; 
dt.Rows.Add(dr); 

dr = dt.NewRow(); 
dr["LowerRange"] = "6,7,8,9,10"; 
dr["UpperRange"] = "66"; 
dt.Rows.Add(dr); 

私は整数のリストを持っています。

List<int> lstEff = new List<int>() { 4,5,6,7 }; 

整数リスト内の項目の中で、リスト内に1つ以上の一致があるデータテーブルの列値を探したいとします。そして最も低いマッチが取られなければならない。

この場合、「1,2,3,4,5」に対応する行番号を取得する必要があります。

行の値が55で、5を検索している場合はtrueを返すため、Containsは使用できません。私はlinqを使って整数検索をしたい。

私はlinqを初めて使っています。このようなことを試しましたが、エラーがあります。

foreach (int i in lstEff) 
{ 
    dt.AsEnumerable().Where(c => c.Field<string>("LowerRange").Split(',').ToList<int>().Contains(i.ToString())); 
} 
+2

のようなSTHをお勧めします、( '分割する必要があります'、') 'を引用符で囲みます。 – Pikoh

+0

@Pikoh .Changed。 –

+0

Yea ..文字列を整数のリストに変換する際にエラーが発生しました。分割( '、')。()この部分は私には思っています –

答えて

1

String.Splitは文字列のリストを提供します。それらの値を文字列からintに変換し、後で比較する必要があります。最初のリストに変換し、あなたがFindIndex経由rowIndexプロパティを取得します:

var rowNo= 
    dt.AsEnumerable().ToList().FindIndex(c => c.Field<string>("LowerRange").Split(',').Select(rangeItemStr=>int.Parse(rangeItemStr)).Any(rangeItem=>lstEff.Contains(rangeItem))); 

行とrowIndexに両方を取得するには、私は一見この

var rows= dt.AsEnumerable().ToList(); 
var rowIndex = rows.FindIndex(c => c.Field<string>("LowerRange").Split(',').Select(rangeItemStr=>int.Parse(rangeItemStr)).Any(rangeItem=>lstEff.Contains(rangeItem))); 
var row = rows[rowIndex]; 
+0

ありがとうございました。詳細は無意味でした:) –

+0

var exists = dt.AsEnumerable()。ここで(c => c.Field ( "LowerRange")。)Split( '、')。Select(rangeItemStr => int.Parse (rangeItem => rangeItem == i));任意の(rangeItem => rangeItem == i)); –

+0

これは私のために働く。彼は行IDを取得する方法。 –

関連する問題