84

テーブルからのいくつかの列値のリストがあるとしましょう。空の文字列と重複する値を削除するにはどうすればよいですか。次のコードを参照してください。

List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();

これは私が今コーディングしたものですが、Amiramのコードははるかにエレガントなので、ここでその答えを選択します。

DataTable dtReportsList = someclass.GetReportsList();

        if (dtReportsList.Rows.Count > 0)
       { 
           List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
           dtList.RemoveAll(x=>x == "");
           dtList = dtList.Distinct().ToList();         

           rcboModule.DataSource = dtList;
           rcboModule.DataBind();               
           rcboModule.Items.Insert(0, new RadComboBoxItem("All", "All"));
       }
4

4 に答える 4

217
dtList  = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()

空の文字列と空白はnullのようなものだと思いました。そうでない場合は、IsNullOrEmpty(空白を許可する)、またはを使用できますs != null

于 2012-08-08T14:47:40.950 に答える
10

Amiramの答えは正しいですが、実装されているDistinct()はN2操作です。リスト内の各アイテムについて、アルゴリズムはそれをすでに処理されたすべての要素と比較し、一意である場合はそれを返し、そうでない場合は無視します。私たちはもっとうまくやることができます。

ソートされたリストは線形時間で重複排除できます。現在の要素が前の要素と等しい場合は無視し、そうでない場合は返します。並べ替えはNlogNであるため、コレクションを並べ替える必要がある場合でも、いくつかの利点があります。

public static IEnumerable<T> SortAndDedupe<T>(this IEnumerable<T> input)
{
   var toDedupe = input.OrderBy(x=>x);

   T prev;
   foreach(var element in toDedupe)
   {
      if(element == prev) continue;

      yield return element;
      prev = element;      
   }
}

//Usage
dtList  = dtList.Where(s => !string.IsNullOrWhitespace(s)).SortAndDedupe().ToList();

これは同じ要素を返します。並べ替えただけです。

于 2012-08-08T15:01:00.640 に答える
6

Amiram Korachのソリューションを簡素化するには:

dtList.RemoveAll(s => string.IsNullOrWhiteSpace(s))

Distinct()またはToList()を使用する必要はありません

于 2020-10-27T10:54:52.643 に答える
1

AmiramKorachソリューションは確かに整頓されています。汎用性のための代替手段があります。

var count = dtList.Count;
// Perform a reverse tracking.
for (var i = count - 1; i > -1; i--)
{
    if (dtList[i]==string.Empty) dtList.RemoveAt(i);
}
// Keep only the unique list items.
dtList = dtList.Distinct().ToList();
于 2012-08-08T15:01:52.543 に答える