1

私は自分の例を完全に間違って表現したことに気付いたので、前もってお詫びします。ご回答いただいた皆様には、心より感謝申し上げます。もっと正確な説明でもう一度説明させてください。回答を編集してください。前回の投稿で正確でなかったことを改めてお詫び申し上げます。

Staging(Stagingテーブルの表現)と呼ばれるエンティティフレームワークモデルクラスを使用すると、次のようになりますList<Staging>

List<Staging> data = (from t in database.Stagings select t).ToList();
//check for an empty List...react accordingly...

これがどのように見えるかを簡単に見てみましょうStaging

public partial class Staging
{
    public int ID { get; set; }        //PK
    public int RequestID { get; set; } //FK
    ...
    public string Project { get; set; }
    ...
}

dataクエリが10レコードを私のリストに返すと仮定しましょう。また、、、およびそれぞれの値が同じdata[3]であると仮定します。たとえば、。値は実行時までわかりません。data[6]data[7]data.Project"Foo"data.Project

これを考えると、最初のオカレンスをどのように保持しdata[3]、を削除data[6]してdata[7]から削除しList<Staging>ますか?

編集: 私は動作する次のコードを持っていますが、別の方法はありますか?

  HashSet<string> projectValuesFound = new HashSet<string>();
  List<Staging> newData = new List<Staging>();

  foreach (Staging entry in data)
  {
    if (!projectValuesFound.Contains(entry.Project))
    {
      projectValuesFound.Add(entry.Project);
      newData.Add(entry);
    }
  }
4

4 に答える 4

2

これは、LINQ と a を介して行うことができますHashSet<T>

var found = new HashSet<string>();
var distinctValues = theList.Where(mc => found.Add(mc.Var3));

// If you want to assign back into the List<T> again:
// theList = distinctValues.ToList();

これが機能HashSet<T>.Addするのは、値がまだセットにない場合は true を返し、既に存在する場合は false を返すためです。そのため、 の最初の「一致する」値のみを取得しますVar3

于 2013-02-15T17:32:24.777 に答える
0

Linq を使用できます。

var result = (from my in theList where my.Var3 == "Foo" select my).First();

他のアイテムも保持したい場合は、First() の代わりにDistinct()を使用できます。Dictinct() を使用するには、MyClassを実装するか、MSDN リンクに示されているように をIEquatable<T>提供する必要があります。IEqualityComparer<T>

于 2013-02-15T17:31:44.153 に答える
0
var uniques = (from theList select theList.Var3).Distinct();

これにより、すべてのエントリに対して個別の値が得られます。

于 2013-02-15T17:35:23.330 に答える
0

それを行う「標準的な」方法は、適切に実装された比較子をDistinctに渡すことです。

class Var3Comparer : IEqualityComparer<MyClass> {
    public int GetHashCode(MyClass obj) {
        return (obj.Var3 ?? string.Empty).GetHashCode();
    }
    public bool Equals(MyClass x, MyClass y) {
        return x.Var3 == y.Var3;
    }
}

// ...

var distinct = list.Distinct(new Var3Comparer());

現在の実装は「生き残った」要素の順序を維持しているように見えますが、ドキュメントには「順序付けられていないシーケンスを返す」と記載されており、そのように扱うのが最善であることに注意してください。

比較子を必要としないDistinct オーバーロードもあります。これは、 Default比較子を想定しているだけであり、.MyClass

于 2013-02-15T17:58:01.490 に答える