0

行と列がほとんどないデータセットがあります。列の状態には、一致する行が多数あります。同じ状態のすべての行をいくつかのリストにバインドしたい..それを達成する方法.

私は同じ状態にあるすべての行に同じ資本を持っているので、私は毎回ループを実行したくないのでそれが必要です...代わりに、同じ資本があるすべての行をバインドして使用したいですそのデータ。

  DataSet ds = new DataSet();
  da.Fill(ds, "table1");
  DataTable dt = new DataTable();
  dt = ds.Tables[0];

もっとはっきりさせて

州、首都、人口の列を含むデータセットがあります...このデータを他の方法で使用したいので、ループを使用します。州がタミルナドゥの場合、首都と人口はすべての行で同じになります..データに対して何度もループする必要がないので、代わりに同じ状態のデータを何かにバインドして使用したい..これが私の要件です..

4

2 に答える 2

2

さて、次のようにして、行をリストに入れることができます。

using System.Linq;

...

var rowsArray = new DataRow[dt.Rows.Count];
dt.Rows.CopyTo(rowsArray, 0);
var rowsList = rowsArray.ToList();

ただし、指定した基準に基づいてフィルタリングする限り、ここには十分な情報がないため、わかりません。

ここで余談ですが、実際には次のDefaultViewようなものを使用してフィルター処理できます。

dt.DefaultView.RowFilter = "some filter here";

そして、にバインドするだけDefaultViewです。これに関するドキュメントはこちらにあります。

編集された質問の更新

さて、あなたが望むものに基づいて、ここにあなたが必要とすることをする実用的なコンソールアプリケーションがあります. EqualityComparerつまり、 を実装し、上記のコードに 1 行追加する必要がありDistinctます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<object[]>
            {
                new object[] {"tamilnadu","capital",2000000},
                new object[] {"other","capital",9490384},
                new object[] {"tamilnadu","capital",2000000}
            };

            foreach (var item in list)
            {
                Console.WriteLine(string.Format("{0} | {1} | {2}", item[0], item[1], item[2]));
            }

            Console.WriteLine();
            Console.WriteLine();

            var distinctList = list.Distinct(new MyArrayComparer());

            foreach (var item in distinctList)
            {
                Console.WriteLine(string.Format("{0} | {1} | {2}", item[0], item[1], item[2]));
            }
        }

        class MyArrayComparer : EqualityComparer<object[]>
        {
            public override bool Equals(object[] x, object[] y)
            {
                if (x.Length != y.Length) { return false; }
                for (int i = 0; i < x.Length; i++)
                {
                    if (!x[i].Equals(y[i]))
                    {
                        return false;
                    }
                }
                return true;
            }

            public override int GetHashCode(object[] obj)
            {
                return 0;
            }
        }
    }
}
于 2012-10-15T11:31:04.167 に答える
1
    List<YourObject> mylist = new List<YourObject>();
    YourObject obj;
    foreach (DataRow dr in dt.Rows)
    {
        obj = new YourObject()
        obj.PropertyA = dr["columnA"];
        obj.PropertyB = dr["columnB"];
        obj.PropertyB = dr["columnB"];
        mylist.Add(obj);
    }

PSメモ帳で作業しているため、構文エラーが発生する可能性があります。現在、コンパイラはありません

Linq を使用している場合は、この方法を使用することもできます: DataTable を汎用リストに変換するにはどうすればよいですか?

于 2012-10-15T11:40:25.360 に答える