2

考虑以下类:

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

我需要从四个记录中查询一个不同的值: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)

我需要查询做的是返回不同的Deparments where State='Texas'。但我需要能够在Where子句中添加多个案例。因此,另一个查询可能需要返回不同的 Status 的 where State= 'Texas' 和Dept= 'HR'。

总是只有一个领域我需要与众不同。

因此,我的第一个查询示例的结果将是“HR”和“DEV”,因为它们是将“德克萨斯”作为州的不同部门。第二个查询的结果将是“3”和“5”,因为它们是不同的状态,其中州是“德克萨斯”,部门是“人力资源”。

更新:

这是我为 Query #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

不同的意思是跨行的所有元素。如果您有两行所有返回的元素都相同,则 distinct 会将其减少为一行,但即使一个元素不同,则两行都将在 distinct 后返回。当然,您可以覆盖它(如此和 Evgraf 的回答中所见)。 分组运算符更有可能是您正在寻找的(是 VB.net 中的一个示例)。

于 2012-12-21T18:50:14.520 回答
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 回答