LINQ OrderBy المساعدة اللازمة
-
03-07-2019 - |
سؤال
أحاول إنشاء مجموعة من السلاسل في أمر محدد من قبل مجموعة أخرى.يبدو مربكا أنا أعرف لذلك اسمحوا لي أن أشرح
requiredOrderOfElements
{
[0] category1,
[1] categoryX,
[2] something else
}
موكلي يمر صفيف سلسلة تحتوي على مفتاح وقيمة أي
مرت من العميل
{
[0][0] categoryX,
[0][1] value from Category X,
[1][0] something else,
[1][1] value for something else,
[2][0] category1,
[2][1] value from Category 1
}
ما أريده هو "قيمة" النصوص في النظام المطلوب من مفاتيح
ما أريد
[0]value from Category 1
[1]value from Category X
[2]value for something else
لقد بحثت في OrderBy / IComparer و لا أرى وسيلة واضحة لتنفيذ ما أريد.بلدي الحل الحالي هو قبيح متداخلة على حلقة
أي أفكار عن طريقة أكثر أناقة سيكون موضع تقدير.
تحديث:- هنا هو اختبار
[TestFixture]
public class GL_Linq_Test
{
[Test]
public void CanOrderByAnotherArray()
{
var requiredOrder=new[]{"my","required","order"};
var passedFromClient = new[]
{
new[] {"required", "cat"},
new[] {"order", "dog"},
new[] {"my", "bird"}
};
var ordered = FunkyOrderer.Order(requiredOrder, passedFromClient);
Assert.That(ordered.First()[1],Is.EqualTo("bird"));
Assert.That(ordered.Skip(1).First()[1], Is.EqualTo("cat"));
Assert.That(ordered.Skip(2).First()[1], Is.EqualTo("dog"));
}
}
public static class FunkyOrderer
{
//returns order bird,dog,cat not bird,cat,dog
public static IEnumerable<string[]> Order(string[] requiredOrder, IEnumerable<string[]>passedFromClient)
{
return from o in requiredOrder
join f in passedFromClient on o equals f[0]
orderby o
select f;
}
}
المحلول
المشكلة هي أنك افتراض مجموعة من السلاسل سوف يكون أمر من قبل مؤشر (لن).ترتيب "my", "order", "required"
هو الصحيح باستخدام المدمج في سلسلة comparer.أسهل حل هو تعديل استعلام LINQ أن يأخذ هذا المؤشر بعين الاعتبار عند الطلب.
return from o in requiredOrder.Select((o, i) => new { Value = o, Index = i })
join f in passedFromClient on o.Value equals f[0]
orderby o.Index
select f;
نصائح أخرى
var orderByThese = new string[] { "category1", "categoryX", "something else" };
var fromClient = new string[][]
{
new string[] { "categoryX", "value from Category X" },
new string[] { "something else", "value for something else" },
new string[] { "category1", "value from Category 1" }
};
var joined = from o in orderByThese
join f in fromClient on o equals f[0]
orderby o
select f;
لا تنتمي إلى StackOverflow