2

次のクラスを検討してください。

Public Class Employee
   Public State As String   
   Public Dept As String
   Public Status as Integer
End Class

4 つのレコードであるa から個別の値をクエリする必要があります。listEmployees

oEmp = New Employee
oEmp.Dept = "HR"
oEmp.State = "Kansas"
oEmp.Status = 1
listEmployees.Add(oEmp)

oEmp = New Employee
oEmp.Dept = "HR"
oEmp.State = "Texas"
oEmp.Status= 3
listEmployees.Add(oEmp)

oEmp = New Employee
oEmp.Dept = "HR"
oEmp.State = "Texas"
oEmp.Status= 5
listEmployees.Add(oEmp)

oEmp = New Employee
oEmp.Dept = "DEV"
oEmp.State = "Texas"
oEmp.Status= 7
listEmployees.Add(oEmp)

クエリで実行する必要があるのは、State= 'Texas' である個別の Deparments を返すことです。ただし、句に複数のケースを追加できる必要があります。Whereしたがって、別のクエリで、State= 'Texas' とDept= 'HR' という個別の Status を返す必要がある場合があります。

明確にする必要があるフィールドは常に 1 つだけです。

したがって、最初のクエリ例の結果は "HR" と "DEV" になります。これは、州が "Texas" である個別の部門であるためです。2 番目のクエリの結果は "3" と "5" になります。これは、州が "Texas" で部門が "HR" である個別のステータスであるためです。

アップデート:

クエリ#1で作業しているものは次のとおりです。

Dim test = (From emp As Employee In listEmployees
            Where emp.State = "Texas"
            Select emp.Dept).Distinct()

ただし、State「TTexas」など、存在しないものを指定すると、次の例外が発生します (コードは爆発しませんが、testこの行の実行後に Visual Studio で変数を調べると、これが発生します) :

タイプ 'System.Linq.SystemCore_EnumerableDebugViewEmptyException' の例外がスローされました。System.Linq.SystemCore_EnumerableDebugView`1.get_Items() で

これは通常の LINQ の動作ですか?

4

3 に答える 3

2

編集後(新しい問題)。はい、これは「通常の」(意図された)動作です。のコードをget_Items参照してください:

public T[] Items
{
    get
    {
        List<T> tempList = new List<T>();
        IEnumerator<T> currentEnumerator = this.enumerable.GetEnumerator();

        if (currentEnumerator != null)
        {
            for(count = 0; currentEnumerator.MoveNext(); count++)
            {
                tempList.Add(currentEnumerator.Current);
            }
        }
        if (count == 0)
        {
            throw new SystemCore_EnumerableDebugViewEmptyException();
        }
        cachedCollection = new T[this.count];
        tempList.CopyTo(cachedCollection, 0);
        return cachedCollection;
    }
}

「count = 0」などを表示するだけでなく、デバッグビューが例外をスローする必要があるのはなぜだろうかと思いますが、それはおそらく単なる無知です。

于 2012-12-22T20:25:10.327 に答える
0

アイテムの同等性を検出するために独自の比較子を作成する

public class Comparer : IEqualityComparer<Employee>
{
    public bool Equals(Employee x, Employee y)
    {
        throw new NotImplementedException();
    }

    public int GetHashCode(Employee obj)
    {
        throw new NotImplementedException();
    }
}

そしてそれを使う

... .Distinct(new Comparer());
于 2012-12-21T18:51:41.580 に答える
0

個別とは、行のすべての要素にわたることを意味します。返されるすべての要素が同じである 2 つの行がある場合、distinct はそれを 1 つの行に減らしますが、要素が 1 つでも異なる場合は、distinct の後に両方の行が返されます。もちろん、これをオーバーライドすることもできます(こことEvgrafの回答に見られるように)。 グループ化演算子は、探しているものである可能性が高くなります (これは VB.net の例です)。

于 2012-12-21T18:50:14.520 に答える