LINQ加入和orderby问题

BCl*_*don 1 c# linq c#-4.0

好吧,我几天来一直在反对这个问题,在学习LINQ后我觉得我走在了正确的轨道上.但我有一个SQL大脑,有时很难转换为C#.

我有两个数组,一个按字母顺序排序,另一个按ID排序.我需要按字母顺序排序第二个数组.ID是加入因子.IEAID = P.ID.

这是我的数组和示例值;

private IGenericListItem[] _priceLevels = new IGenericListItem[0];
_priceLevels is in the form of {ID, Name}
{3, A}
{8, B}
{4, C}
{7, D}
{5, E}
{9, F}
{1, G}
Run Code Online (Sandbox Code Playgroud)

编辑:更新此以显示_assignmentControls包含一个子数组.我没有为疯狂做这样的借口.它实际上包含_priceLevels的副本...

protected ArrayList _assignmentControls = new ArrayList();
_assignmentControls is in the form of {ID, LastPrice, NewPrice, _priceLevels[]}
{1, 1.00, 2.00, _priceLevels}
{2, 1.00, 2.00, _priceLevels}
{3, 1.00, 2.00, _priceLevels}
{4, 1.00, 2.00, _priceLevels}
Run Code Online (Sandbox Code Playgroud)

部分问题在于我正在尝试比较/加入ArrayList和IGenericListItem.

In SQL I would do something like this;
SELECT A.* 
FROM _assignmentControls A JOIN _priceLevels P
    ON A.ID = P.ID
ORDER BY P.Name
Run Code Online (Sandbox Code Playgroud)

这将返回一个_assignmentControls表,该表按_priceLevels中的值排序.

在C#LINQ中,我做到了这一点,但似乎无法做到这一点;

        var sortedList =
            from a in _assignmentControls
            join p in _priceLevels on a equals p.ID
            orderby p.Name
            select _assignmentControls;
Run Code Online (Sandbox Code Playgroud)

我在join和orderby下获得红色波浪形,p.Name中的p为红色.并且A)它不起作用.B)我不确定它会将sortedList作为按_priceLevels.Name排序的_assignmentControls的排序版本返回.

编辑:当我将鼠标悬停在"加入"时,我得到"方法的类型参数'IEnumerable System.Linq.Enumerable.Join(此Enumerable,IEnumerable,Func,Func ....'不能从查询中提取.我是现在正在研究.

谢谢你的期待!

Eri*_*ert 6

当我将鼠标悬停在"join"上时,我得到"该方法的类型参数IEnumerable System.Linq.Enumerable.Join(this Enumerable,IEnumerable, Func,Func....不能从查询中获取.

我可以解释这里发生了什么,以便你可以追踪它.

当你说

from firstitem in firstcollection
join seconditem in secondcollection on firstkey equals secondkey
select result
Run Code Online (Sandbox Code Playgroud)

编译器将其转换为:

Enumerable.Join(
    firstcollection,
    secondcollection, 
    firstitem=>firstkey, 
    seconditem=>secondkey, 
    (firstitem, seconditem)=>result)
Run Code Online (Sandbox Code Playgroud)

Enumerable.Join 是一个通用方法,它有四个类型参数:第一个集合的元素类型,第二个集合的元素类型,键类型和结果类型.

如果您收到该错误,那么根据您提供给编译器的信息,无法推断出这四件事中的一件.例如,也许:

  • 第一个集合的类型实际上不是序列.
  • 第二个集合的类型实际上不是一个序列.
  • 无法推断出结果的类型
  • 这两个键的类型不一致,没有唯一的最佳类型.

最后一点是最有可能的.例如,假设第一个键是int,第二个键是short.由于每个short都可以转换为int,int将获胜,第二个键将自动转换为int.现在假设第一个键类型是Giraffe,第二个键类型是Tiger.两者都不比另一个好.C#并没有说"哦,他们都是两种Animal,所以我们选择它." 相反,它表示你没有提供足够的信息来确定你的意思; 你应该将其中一个投入Animal,然后它变得清晰.

合理?

我在2006年有一个半小时的视频来解释这个功能 - 当我向编译器添加有问题的功能时,这又回来了 - 所以如果你想要更深入的解释,请查看它.

http://ericlippert.com/2006/11/17/a-face-made-for-email-part-three/

更新:我再次仔细阅读你的问题:

部分问题是因为我正在尝试比较/加入an ArrayList和an IGenericListItem.

有问题.序列的类型不能从a确定ArrayList.你不应该再使用ArrayList了.事实上,你不应该在2005年之后编写的任何代码中使用它.List<T>用于一些合适的T.

  • @BClaydon:这两个序列不需要是同一类型.它们需要是*通用序列类型*,即`IEnumerable <something>`但两个"somethings"可以是不同的.需要相同的是*键选择器类型*.以这种方式思考:如果您有一个客户列表和一个订单列表,那么这两个列表的类型不同是客户和订单.但是*加入*列表的选择器必须是相同的:比如说,客户有一个字段ID而一个订单有一个字段CustomerId - 连接键类型必须在两边都相同. (3认同)