當前位置: 首頁>>代碼示例>>C#>>正文


C# List.Select方法代碼示例

本文整理匯總了C#中WpfApplication1.List.Select方法的典型用法代碼示例。如果您正苦於以下問題:C# List.Select方法的具體用法?C# List.Select怎麽用?C# List.Select使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在WpfApplication1.List的用法示例。


在下文中一共展示了List.Select方法的3個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C#代碼示例。

示例1: SaveTimerValue

        public static void SaveTimerValue(List<TimeSpan> items)
        {
            if( items.Count == 0 )
            {
                return;
            }

            File.WriteAllLines(outputValueFileName, items.Select(c => c.ToString(@"hh\:mm\:ss")));
        }
開發者ID:ishikura,項目名稱:MyTimer2nd,代碼行數:9,代碼來源:TimerFileIO.cs

示例2: CutByLineForCrossDi

        /// <summary>
        /// 用於獲得交點進出性的切割函數
        /// </summary>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <param name="list"></param>
        /// <param name="line2Idx"> </param>
        /// <returns></returns>
        private static Tuple<CrossInOut, int, bool> CutByLineForCrossDi(VertexBase v1, VertexBase v2, List<VertexBase> list, bool withIdx, int line2Idx = 0)
        {
            bool hasIntersection = false;
            bool smallToBig = true;

            var crossXsmaller = new List<IntersWithIndex>();
            var crossXbigger = new List<IntersWithIndex>();

            var slope = (v2.Y - v1.Y) / (v1.X - v2.X);
            var minX = v1.X;
            var maxX = v2.X;
            if (v1.X > v2.X)
            {
                minX = v2.X;
                maxX = v1.X;
                smallToBig = false;
            }

            //錯切後的切割多邊形
            var shearedPolyC = list.Select(r => new Vertex(r.X, r.X * slope + r.Y) { Name = r.Name }).ToList();
            //把實體多邊形的第一條邊(即切線)錯切後得到一條水平直線
            var y = v1.X * slope + v1.Y;

            for (var toCutLineStart = 0; toCutLineStart < list.Count; toCutLineStart++)
            {
                var c1 = shearedPolyC[toCutLineStart % list.Count];//注意,不要漏了文檔中C4->C1這種結尾的線段
                var c2 = shearedPolyC[(toCutLineStart + 1) % list.Count];

                // 重合
                if (c1.Y == c2.Y && c1.Y == y) continue;
                //不相交
                if (c1.Y > y && c2.Y > y) continue;
                if (c1.Y < y && c2.Y < y) continue;

                var x = LineCrossH(y, c1, c2);
                var npy = y - x * slope;

                if (!hasIntersection)
                    if ((x > minX && x < maxX) ||
                        (c2.Y == y && x == v2.X) ||
                        (x == minX && c1.Y != y && c2.Y != y) ||
                        (x == maxX && c1.Y != y && c2.Y != y)
                    )
                        hasIntersection = true;

                var inters = new IntersWithIndex(x, npy, toCutLineStart);
                if (smallToBig)
                {
                    if (x < minX) crossXsmaller.Add(inters);
                    if ((x > minX && x < maxX) ||
                        (x == minX && c2.Y == y) ||
                        (x == minX && c1.Y != y && c2.Y != y) ||
                        (x == maxX && c2.Y == y) ||
                        (x == maxX && c1.Y != y && c2.Y != y) ||
                        (x > maxX) //這個必不可少,不然影響進出性判斷
                        )
                        crossXbigger.Add(inters);
                }
                else
                {
                    if (x > maxX) crossXsmaller.Add(inters);
                    if ((x > minX && x < maxX) ||
                        (x == maxX && c2.Y == y) ||
                        (x == maxX && c1.Y != y && c2.Y != y) ||
                        (c2.Y == y && x == minX) ||
                        (x == minX && c1.Y != y && c2.Y != y) ||
                        (x < minX) //這個必不可少,不然影響進出性判斷
                        )
                        crossXbigger.Add(inters);
                }
            }

            if (!hasIntersection) return Tuple.Create(CrossInOut.In, 0, false);

            if (smallToBig)
                crossXbigger.Sort((p1, p2) => p1.X.CompareTo(p2.X));
            else
                crossXbigger.Sort((p1, p2) => -(p1.X.CompareTo(p2.X)));

            var count = crossXbigger.Count;
            CrossInOut crossRet;
            int cuttedLineIdx;

            if (withIdx)//切割多邊形的一條邊去切實體多邊形的一條邊
            {
                int countSkip = 0;
                for (; ; countSkip++)
                {
                    if (crossXbigger[countSkip].Idx == line2Idx)//line2Idx確定了實體多邊形的這條邊
                        break;
                }
                count += countSkip;
//.........這裏部分代碼省略.........
開發者ID:woniuchn,項目名稱:blog_sample_codes,代碼行數:101,代碼來源:ArbitraryPolygonCut.cs

示例3: Cut

        // 傳入的多邊形的點需要封閉,即首尾點要相同
        public static List<List<VertexBase>> Cut(List<VertexBase> listS, List<VertexBase> listC)
        {
            //如果是浮點數,使用這個處理保證相等比較正確
            PrepareVertex(listS);
            PrepareVertex(listC);

            int cutStartIdx = 0;//實際切割由這個idx起始即可

            // 階段1: 這個循環中的切割用於判斷方向
            // 如果這步中沒有發現交點,則進入不相交多邊形的處理
            for (; cutStartIdx < listS.Count; cutStartIdx++)
            {
                //用實體多邊形的一條邊去切切割多邊形
                var s1 = listS[cutStartIdx % listS.Count];
                var s2 = listS[(cutStartIdx + 1) % listS.Count];

                Tuple<CrossInOut, int, bool> ret;
                if (s1.X == s2.X)
                    ret = CutByLineVerticalForCrossDi(s1, s2, listC, false);
                else
                    ret = CutByLineForCrossDi(s1, s2, listC, false);
                //如果沒有交點,繼續下一條邊。
                if (!ret.Item3) continue;

                var interDirect1 = ret.Item1;//交點對於切割多邊形的進出性
                var cutLineIdx = ret.Item2;//交點所在的切割多邊形的邊的起點的索引,用於在使用切割多邊形邊去切實體多邊形時,確定那條邊

                WindowLog.Default.Log("得到S多邊形邊{0}{1}切割C多邊形{2}{3}產生的交點,對於S進出性為{4}", s1.Name, s2.Name,
                    listC[cutLineIdx % listC.Count].Name,
                    listC[(cutLineIdx + 1) % listC.Count].Name,
                    interDirect1 == CrossInOut.In ? "進" : "出");

                //用切割多邊形的一條邊(cutLineIdx->cutLineIdx+1)去切實體多邊形
                var ret2 = CutByLineForCrossDi(listC[cutLineIdx % listC.Count],
                                               listC[(cutLineIdx + 1) % listC.Count],
                                               listS, true, cutStartIdx);
                var interDirect2 = ret2.Item1;

                WindowLog.Default.Log("得到C多邊形邊{0}{1}切割S多邊形{2}{3}產生的交點,對於C進出性為{4}",
                  listC[cutLineIdx % listC.Count].Name,
                  listC[(cutLineIdx + 1) % listC.Count].Name,
                  s1.Name, s2.Name,
                  interDirect2 == CrossInOut.In ? "進" : "出");

                if (interDirect1 == interDirect2) //進出性相同表示多邊形不同向,反轉其中一個多邊形
                {
                    WindowLog.Default.Log("交點進出性相同,把C多邊形反向");
                    //文檔中是把S進行了反向,但這裏不行,如果反向S,則記錄的第一個交點(主要是記錄這個交點的進出性)就不再是第一個交點了
                    //所以實際實現中需要將C反向,而且反向後第一條邊,仍然需要是確定第一點那條線段
                    var listCReverse = new List<VertexBase>();
                    var reverseStartIdx = cutLineIdx + 1;
                    for (int i = 0; i < listC.Count; i++)
                    {
                        listCReverse.Add(listC[(reverseStartIdx - i + listC.Count) % listC.Count]);
                    }

                    listC = listCReverse;

                    WindowLog.Default.ReversePolygon();
                    WindowLog.Default.Log("反向後多邊形點序列為:{0}", string.Join("->", listC.Select(r => r.Name)));
                }

                WindowLog.Default.Log("使用S多邊形邊{0}{1}與C多邊形{2}{3}交點為第一個點,對於S進出性為{4}", s1.Name, s2.Name,
                        listC[cutLineIdx % listC.Count].Name,
                        listC[(cutLineIdx + 1) % listC.Count].Name,
                        interDirect1 == CrossInOut.In ? "進" : "出");

                _firstInterDi = ret.Item1;
                break;
            }

            if (cutStartIdx == listS.Count)//沒有交點
            {
                WindowLog.Default.Log("沒有交點,進入無交點情況處理");

                var ret = ProcessNoCross(listS, listC);
                return ret == null ? new List<List<VertexBase>>() : new List<List<VertexBase>> { ret };
            }

            // 階段2: 鏈接多邊形,即設置Next
            LinkNode(listS.Cast<Vertex>().ToList());
            LinkNode(listC.Cast<Vertex>().ToList());
            var listI = new List<Intersection>();
            var linkC = new LinkedList<VertexBase>(listC);

            //循環中用S中每條邊切割C(準確說是C的鏈表,每次切割後交點插入C的列表再進行下次切割),把交點插入S和C形成多邊形鏈表
            for (; cutStartIdx < listS.Count; cutStartIdx++)
            {
                var s1 = listS[cutStartIdx % listS.Count] as Vertex;
                var s2 = listS[(cutStartIdx + 1) % listS.Count] as Vertex;

                WindowLog.Default.Log("---------------使用S多邊形邊{0}{1}切割C多邊形---------------", s1.Name, s2.Name);

                var inters = CutByLine(s1, s2, linkC);
                //var inters = ret;

                if (inters.Count == 0) continue;

                listI.AddRange(inters);
//.........這裏部分代碼省略.........
開發者ID:woniuchn,項目名稱:blog_sample_codes,代碼行數:101,代碼來源:ArbitraryPolygonCut.cs


注:本文中的WpfApplication1.List.Select方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。