Linq OrderBy against specific values

后端 未结 8 1739
悲&欢浪女
悲&欢浪女 2020-12-04 17:41

Is there a way in Linq to do an OrderBy against a set of values (strings in this case) without knowing the order of the values?

Consider this data:

A         


        
8条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-04 18:25

    I use these. I like the IEnumerable overload for cleanliness, but the priority map version should have better performance on repeated calls.

        public static IEnumerable OrderByStaticList(this IEnumerable items, IReadOnlyDictionary priorityMap)
        {
            return items.OrderBy(x => priorityMap.GetValueOrDefault(x, double.MaxValue));
        }
    
        public static IEnumerable OrderByStaticList(this IEnumerable items, IEnumerable preferenceOrder)
        {
            int priority = 0;
            var priorityMap = preferenceOrder.ToDictionary(x => x, x => (double) priority++);
            return OrderByStaticList(items, priorityMap);
        }
    
    
    
    
        [TestMethod]
        public void PriorityMap_DeterminesSort()
        {
            var map = new Dictionary()
            {
                {'A', 1},
                {'B', 7},
                {'C', 3},
                {'D', 42},
                {'E', -1},
            };
            Assert.AreEqual("EACBD", new string("ABCDE".OrderByStaticList(map).ToArray()));
        }
    
        [TestMethod]
        public void PriorityMapMissingItem_SortsLast()
        {
            var map = new Dictionary()
            {
                {'A', 1},
                {'B', 7},
                {'D', 42},
                {'E', -1},
            };
            Assert.AreEqual("EABDC", new string("ABCDE".OrderByStaticList(map).ToArray()));
        }
    
        [TestMethod]
        public void OrderedList_DeterminesSort()
        {
            Assert.AreEqual("EACBD", new string("ABCDE".OrderByStaticList("EACBD").ToArray()));
        }
    
        [TestMethod]
        public void OrderedListMissingItem_SortsLast()
        {
            Assert.AreEqual("EABDC", new string("ABCDE".OrderByStaticList("EABD").ToArray()));
        }
    

提交回复
热议问题