如何使用linq方法对集合进行排序

时间:2010-10-20 09:55:17

标签: c#

我有一个List<> (ListA)具有许多属性,其中之一是List<> (ListA_1)。 此时,我使用linq方法对字符串属性进行排序(ListA),如下所示:

var sortedCollection = from c in ListA
                       orderby selector(c), c.Caption
                       select c;

Caption是ListA的字符串属性。

我想用他的属性(ListA_1)用linq方法对ListA进行排序,其中包含许多具有字符串属性的items对象。这可以通过使用linq方法吗?

谢谢你的帮助, 的Sebastien

修改: 示例:

public class ListA : List<ItemA>
{
}

public class ItemA
{
    private string mCaption;
    private ListA1  ListA1 = new ListA1();
}

public class ListA1 : List<ItemA1>
{
}

public class ItemA1
{
    private string mTitle;
    private string mRef;
    private string mType;
}

所以,我有一个ListA集合的itemA的ListA1集合。我想通过ListA1的itemA1.mType属性(来自ListA)

对ListA进行排序

示例:

var sortedCollection = from c in ListA
                       orderby selector(c), c.ListA1 (...ItemA1.mType....)
                       select c;

4 个答案:

答案 0 :(得分:1)

我不完全确定你问的是什么。正如我所理解的那样,您希望根据ListA的排序CaptionListA_1进行排序。var sorted = from c1 in ListA_1 join c in ListA on c1 equals c.Caption select c; 是一个字幕列表。你可以这样做:

ListA

<强> [编辑]
我对你的问题感到困惑的部分原因是我不知道你想如何根据列表mTypeListA_1的值来确定string中项目的顺序}。我看不到自然的顺序。但是现在我知道它是ListA1类型,我可以对你的意思做一些有根据的猜测。

如果我可以假设mType中的所有项目都具有FirstOrDefault()的相同值,那么您只需要从其中一个获取值并按其排序。您可以使用var sorted = from c in ListA orderby selector(c), c.ListA1.FirstOrDefault().mType select c;

来获取它
mType

如果可能有var sorted = from c in ListA let mostCommonType = (from c1 in c.ListA1 group c1.mType by c1.mType into g orderby g.Count() descending select g.Key).FirstOrDefault() orderby selector(c), mostCommonType select c; 的不同值,并且您希望获得最常见的值,则必须找到最常出现的值。

{{1}}

我希望在这些可能的解决方案中抓住你的意思。

答案 1 :(得分:1)

我个人更喜欢使用System.Linq中提供的扩展方法。

// collection is of type ListA
var sortedCollection = collection.OrderBy(x => x.mCaption);

编辑:我想我终于理解了这个问题。据我所知,没有办法在一行中做到这一点。问题是,您需要定义查询的结果类型。我能想到的最佳解决方案需要几行代码。我首先创建一个包含两种类型的List,然后按那种方式排序。

var list = List<KeyValuePair<ItemA, ItemA1>>();
foreach (var item in collection)
    foreach (var item1 in item.ListA1)
        list.Add(new KeyValuePair<ItemA, ItemA1>(item, item1));
var sortedCollection = list.OrderBy(x => x.Value.mTitle);

答案 2 :(得分:0)

如果我们实施ListA1,我们可以IComparable订购。

就像这样:

public class ListA1 : List<ItemA1>, IComparable{

    public int CompareTo(object obj)
    {
        if (obj is ListA1)
        {
            ListA1 l2 = (ListA1)obj;
            return this.ToString().CompareTo(l2.ToString());
        }
        else
            throw new ArgumentException("Object is not a ListA1.");
    }
    public String ToString()
    {
        return String.Join("", this.Select(item => item.mType));
    }

}

然后我们可以通过ListA1订购,就像我们可以通过String订购一样。


如果我们不想实施IComparable,我们可以这样做:

var sortedCollection = from c in ListA 
                       orderby selector(c), GetValueWeWantToOrderBy(c.ListA1) 
                       select c;

让函数GetValueWeWantToOrderBy返回我们订购的值:

public static String GetValueWeWantToOrderBy(ListA1 la1)
{
    return String.Join("", la1.Select(item => item.mType));
}

答案 3 :(得分:0)

我需要具备数据库的约束: 一个SQL表“Type”,其中包含“Type”列和“IdCatalog”列。 一个SQL表“Catalog”,其中包含列“Id”和“Name”列。

对于一个目录,我可以为此目录添加/更新/删除多种类型。

这些数据必须呈现为带有A列“IdCatalog”的HTml表和所有列“Types”。我用对象结构构建这个渲染。

渲染是表格式的,但数据和后面的代码不是。 困难在于使用我构建的对象模型对html表进行排序。

我认为最好的方法是从sql的数据构建数据集以使用真实的表结构。