LINQ可以按列索引排序吗?[已关闭]

nnt7mjpx  于 2022-12-06  发布在  其他
关注(0)|答案(6)|浏览(150)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
11天前关闭。
Improve this question
我正在努力寻找LINQ orderby的例子,其中数据是按列索引排序的。这可能吗?
谢谢你

sqyvllje

sqyvllje1#

在LINQ中没有列的概念,只有字段和属性。您的意思可能是在您创建的匿名类型中指定属性的索引:

from p in persons
orderby 1
select new { p.FirstNam, p.LastName }

这是不可能的,因为a)你不能按投影属性(匿名类型的输出值)排序,b)你不能按索引排序。要解决a),你可以使用“into”关键字:

from p in persons
orderby p.FirstName
select new { First = p.FirstName, Last = p.LastName }
into tmp
   orderby tmp.First
   select tmp;

如果使用基于IQueryable的LINQ提供程序(类似于LINQ to SQL,而不是基于IEnumerable的LINQ to对象),则可以分析表达式树,根据某个索引查找表达式,并添加相应的OrderBy方法调用。

var query = from p in persons 
            select new { Name = p.FirstName + " " + p.LastName, ...}
query = AddOrderByPosition (query, 1);
foreach (var p in query) {...}

AddOrderByPosition必须创建一个新的表达式树,该表达式树使用原始查询表达式作为源(一个子查询,本质上也是“into”创建的),并在末尾添加对OrderBy的调用(不需要Select).您需要先阅读C#规范中有关查询表达式转换的章节,如果你想在合理时间内完成这件事,你应该有一些关于反射和表达的经验。
如果你想要的话,我可以提供一些示例代码。

qkf9rpyu

qkf9rpyu2#

我知道不可能更改索引。

xfyts7mz

xfyts7mz3#

如果是这样的话,下面是我的一个Linq查询的例子:

var tmp = 
    from container in Container
    where container.ContainerTypeID == 2
    select new { ContainerID = container.ContainerID, TypeID = container.ContainerTypeID};

// The indexer cannot be used with the query expression format, so we need to convert to dot notation.
// We also need to convert tmp to an Enumerable so that .NET performs the query instead of SQL.
var results = tmp.AsEnumerable().Select((row, index) => new { row.ContainerID, row.TypeID, ContainerIndex = index });
px9o7tmv

px9o7tmv4#

在LinqToSql中,您有一个Map到数据库的类,其属性名称不会更改。这些属性使用属性(Attribute)Map到数据库。数据库列名位于属性(Attribute)中。
如果您要在设计阶段变更数据行名称,可以使用设计工具(如果类别是自动产生的)或自行变更属性。
如果要在运行时更改列名,则应提供XmlMappingSource。这将覆盖来自属性的Map。

vhmi4jdf

vhmi4jdf5#

今天早些时候我不得不这样做(但是使用多个列--甚至更难)。LINQ肯定不适合我,特别是在传递动态数量的索引时。
你可能运气更好,把你的对象拉到一个List<T>中,然后对它们使用.Sort方法。

var query = db.MyTable.Where(x => something);
var list = query.ToList();
list.Sort((x, y) => {
    // decide how you want to compare
    // use string.compare or another method
    // return -1, 0, 1 as is normal for sorting

    return 0; //Replace this
});
hs1rzwqc

hs1rzwqc6#

假设您有一个字符串数组,每个字符串都包含结构化文本,其中包含固定数量的数据列(字段)。(类似于这种数据,如果它是在文本文件中,您可能会使用命令行工具,如'awk'。)那么下面的C#代码演示了如何使用LINQ按特定列进行排序:

String[] sData = 
{
  "1  BMW     Germany  40000",
  "2  Volvo   Sweden   35000",
  "3  Ferrari Italy   200000",
  "4  Subaru  Japan    30000"
};
int sortCol = 3;
foreach (string sOut in sData.OrderBy(x => Convert.ToInt32(Regex.Split(x, @"\s+")[sortCol])))
{
  Console.WriteLine(sOut);
}

在上图中,我们按第4列排序,这是一个数字。

相关问题