考虑以下课程:
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)
我需要查询做的是返回State
='Texas'的不同Deparments。 但我需要能够在Where
子句中添加多个案例。因此,另一个查询可能需要返回不同的状态,其中State
='德克萨斯'和{{1} } ='HR'。
总会有一个我需要区别的字段。
因此,我的第一个查询示例的结果将是“HR”和“DEV”,因为这些是具有“Texas”作为状态的不同部门。第二个查询的结果将是“3”和“5”,因为这些是不同的状态,其中状态是“德克萨斯”,而部门是“HR”。
更新
以下是我为查询#1工作的内容:
Dept
但是,如果我为Dim test = (From emp As Employee In listEmployees
Where emp.State = "Texas"
Select emp.Dept).Distinct()
指定了一些不存在的内容,例如“TTexas”,我会收到以下异常(代码不会爆炸,但如果我检查State
在此行执行后,Visual Studio中的变量,我得到了这个):
类型异常 抛出了'System.Linq.SystemCore_EnumerableDebugViewEmptyException'。 在System.Linq.SystemCore_EnumerableDebugView`1.get_Items()
这是正常的LINQ行为吗?
答案 0 :(得分:2)
编辑后(新发行)。是的,这是“正常的”(如:预期的)行为。请参阅code of 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”或者其他东西,但这可能只是无知。
答案 1 :(得分:0)
不同意味着跨行的所有元素。如果你有两行所有返回的元素都是相同的,则distinct会将它减少到一行,但即使一个元素不同,那么两行都会在不同之后返回。当然,您可以覆盖此(如here和Evgraf的答案)。 Grouping运算符更有可能是您正在寻找的(here是VB.net中的一个示例)。
答案 2 :(得分: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());