我有一个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;
答案 0 :(得分:1)
我不完全确定你问的是什么。正如我所理解的那样,您希望根据ListA
的排序Caption
对ListA_1
进行排序。var sorted = from c1 in ListA_1
join c in ListA on c1 equals c.Caption
select c;
是一个字幕列表。你可以这样做:
ListA
<强> [编辑] 强>
我对你的问题感到困惑的部分原因是我不知道你想如何根据列表mType
中ListA_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的数据构建数据集以使用真实的表结构。