2010-12-06 25 views
4

3つの列の値が一意であるかどうかを確認するDataTableがあります。そうでない場合、最後の列は、値の組合せの最初の出現の行番号で埋められるべきです。DataTableで一意でない行を表示する

例えば

、この表:

​​3210

この結果につながるはず:

Line Name LastName Age Flag 
------------------------------------- 
1  Bart Simpson  10  - 
2  Lisa Simpson  8  - 
3  Bart Simpson  10  1 
4  Ned  Flanders 40  - 
5  Bart Simpson  10  1 

Iは、2つの入れ子forループをデータテーブルを反復し、値を比較することによって、これを解決しました。少量のデータに対しては正常に動作しますが、DataTableに多くの行が含まれているとかなり遅くなります。

私の質問は、100から20000行の間でデータ量が異なることがあるという点で、この問題の最善の解決方法は何ですか?
LINQを使用してこれを行う方法はありますか? (私はそれに精通していませんが、私は学びたい!)

答えて

0

さて、私は自分で答えを得たと思う。 James Wisemanの答えに基づいて、私はLINQで何かを試しました。

このクエリでは、質問に記載されている結果が得られます。 myErrnrFnct同じ値の他の行がない場合は、列の値を0にしたいので、関数が必要です。

再びmyQueryの外のDataTableを取得するには、私はここで説明するいくつかの拡張機能を追加する必要がありました:
How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow
をそして、この行がどうなる:

Dim myNewDt As DataTable = myQuery.CopyToDataTable() 

これがうまく動作するようです。これをより良くするための提案はありますか?

2

データテーブルを使ってC#/ VBでこれを行う方法についてはコメントできませんが、クエリは次のようになります。

declare @t table (ID int, Name varchar(10), LastName varchar(10), Age int) 
insert into @t values (1,  'Bart' , 'Simpson',  10) 
insert into @t values (2,  'Lisa', 'Simpson' ,  8) 
insert into @t values (3,  'Bart', 'Simpson' , 10) 
insert into @t values (4,  'Ned',  'Flanders' , 40) 
insert into @t values (5 , 'Bart', 'Simpson' , 10) 

select t.*, 
(select min(ID) as ID 
    from @t t2 
    where t2.Name = t.Name 
    and t2.LastName = t.LastName 
    and t2.id < t.id) 
from @t t 

ここではデモ用のテーブルを定義しました。私はあなたがLINQにこれを翻訳することができるかもしれないと思います。

+0

ありがとう、それは副次的な選択(+1)の良い考えです。しかし、私はSQLを必要としないソリューションを好むだろう。私はlinqでこのようなことをしようとします。 –

関連する問題